Autor Beitrag
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1508
Erhaltene Danke: 211


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 24.07.17 17:17 
Hallo Programmierfreunde!

Wieder einmal stehe ich vor der leider unüberwindlichen Hürde, eine Java-Klasse - eigentlich nur eine ihrer Prozeduren - aufzurufen.

Der Inhalt einer Datei namens "DuelMerge.java" beginnt wie folgt:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
package sort.inplace.merge.mine.dist;

public class DuelMerge {

    private Integer[] data;
    
    private int moves = 0;
    private int comparisons = 0;
    
    public void merge(Integer[] data, int from, int from2, int end2) throws Exception {
        this.data = data;
        merge(from, from2-1, from2, end2);
    }
    
    private void merge(int from, int end, int from2, int end2) throws Exception {
        
        int len1 = end - from + 1;
        int len2 = end2 - from2 + 1;
        if (len1 == 0 || len2 == 0) {
            return;
        }
        if (len1 + len2 == 2) {
            if (compare(from2, from) < 0) {
                swap(from2, from);
            }
            return;
        }
        
        if (len1>=len2/2 && len2>=len1/2)
            duelMerge(from, from2-1, from2, end2-2);
        else
            splitMerge(from, from2, end2+1);        
    }


Die aufzurufende Prozedur müßte die erste, also die als public und damit wohl auch dateiübergreifend verfügbare namens "merge" sein.

In der Datei "HelloWorld.java", in die hinein ich diese Java-Datei anscheinend erfolgreich importierte (jedenfalls ohne Fehlermeldung am Beginn der ersten Zeile), versuche ich diese Prozedur auf alle mögliche Weisen aufzurufen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
import sort.inplace.merge.mine.dist.*;//ohne roten Kreis mit weißem Kreuz am Anfang!

public class HelloWorld {
  
  public static void main(String[] args)
  {
    System.out.println("Hello world!");
  
    Integer[] Daten = {2,3,1,4};    
  
    merge(Daten,0,3,4);
    DuelMerge.merge(Daten,0,3,4);
    sort.inplace.merge.mine.dist.merge(Daten,0,3,4);
    DuelMerge.sort.inplace.merge.mine.dist.merge(Daten,0,3,4);
    sort.inplace.merge.mine.dist.DuelMerge.merge(Daten,0,3,4); 
    DuelMerge.sort.inplace.merge.mine.dist.DuelMerge.merge(Daten,0,3,4);

  }
}


doch das klappt natürlich nicht. Bei jeder dieser Zeilen ernte ich einen roten Kreis mit weißem Kreuz, compilieren und laufen tut es natürlich so auch nicht.

Die Fehlermeldungen lauten wie folgt:
Zitat:
"The method merge(Integer[], int, int, int) is undefined for the type HelloWorld" (1. und 4. Zeile der Aufrufversuche)
"Cannot make a static reference to the non-static methode merge(Integer[], int, int, int) from the type DuelMerge" (2. und 5. Zeile)
"sort.inplace.merge.mine.dist cannot be resolved to a type" (3. Zeile)
"sort cannot be resolved or is not a field" (6. Zeile)

Was ist daran nur wieder falsch? Wie gelange ich an diese merge-Prozedur? Liegen die Schwierigkeiten vielleicht am "throws Exception" hinter der merge-Prozedur?

Vielen Dank und Gruß

Delphi-Laie

Moderiert von user profile iconTh69: Quote-Tags hinzugefügt
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1844
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 24.07.17 17:33 
Guten Tag Delphi-Laie,

stell' die Klasse DuelMerge und ihre Methoden statisch um, oder erzeuge in der HelloWorld Klasse ein Objekt von DuelMerge, bevor du die Merge-Methoden aufrufst.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1508
Erhaltene Danke: 211


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 24.07.17 18:42 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Guten Tag Delphi-Laie,

Danke für Deine prompte Antwort, Frühlingsrolle!

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
stell' die Klasse DuelMerge und ihre Methoden statisch um,

Ersteres funktioniert leider nicht. Egal, wo ich "static" einfüge, hinter welchem "public" auch immer, bekomme ich nur die sattsam-altbekannte Fehlermeldung, hierbei meistens: "Cannot use it in a static context".

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
oder erzeuge in der HelloWorld Klasse ein Objekt von DuelMerge, bevor du die Merge-Methoden aufrufst.

Damit komme ich weiter:
ausblenden Quelltext
1:
2:
3:
DuelMerge DM = new DuelMerge();//funktioniert!

DM.merge(Daten, 0, 3, 4);

führt "nur" noch zur Fehlermeldung: "unhandled exception type Exception".

Es hilft leider nicht, in der "DuelMerge.java" alle "throws Exception" in den Deklarationen zu entfernen bzw. auszukommentieren: Die "DuelMerge.java" ist zwar dann immer noch fehlerfrei, der Funktionsaufruf scheitert aber immer noch mit der gleichen Fehlermeldung.

Nochmals danke für die Aufmerksamkeit!

Gruß Delphi-Laie

Moderiert von user profile iconTh69: Code-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3609
Erhaltene Danke: 720

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mo 24.07.17 19:16 
"checked" Exceptions mußt du mit try ... catch fangen, d.h. um den Aufruf der Methode packen.
Alternativ die Methoden abändern, so daß sie RuntimeException zurückliefern (sog. "unchecked exception"), s. z.B. Error - Unhandled exception type Exception?

Für diesen Beitrag haben gedankt: Delphi-Laie
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1844
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 24.07.17 19:29 
Die IDE müsste dich darauf hinweisen, dass die mit angegebenen throws (Kurzschreibweise für einen try catch Block) ebenso übernommen werden müssen bzw. jeweils ein try catch Block angegeben werden muss, d.h.:

ausblenden Java-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
public class DuelMerge {
    public void merge(Integer[] data, int fromint from2, int end2) throws Exception {
    // ...
    }
}

// ... Variante 1 - nicht geeignet, da mit der Exception sogleich die Anwendung abstürzt
public class HelloWorld {
  
    public static void main(String[] args) throws Exception {
        Integer[] Daten = {2,3,1,4};
        DuelMerge DM = new DuelMerge();
        DM.merge(Daten, 034); 
    }
}
// ... Variante 2 - in dem Fall besser einen try catch stattdessen zu verwenden:
public class HelloWorld {
  
    public static void main(String[] args) {
        Integer[] Daten = {2,3,1,4};
        DuelMerge DM = new DuelMerge();
        try {
            DM.merge(Daten, 034); 
        } catch (Exception e) {
            // Fehlerausgabe mit z.B.: "e.getMessage()"
        }
    }
}

Nachtrag

throws und throw sind zwei Paar Schuhe, die man nicht verwechseln sollte. Ein Beispiel:

ausblenden Java-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
static String Division1(float dividend, float divisor) throws java.lang.ArithmeticException {
    return String.format("%f", dividend / divisor);
}
  
static String Division2(float dividend, float divisor) {
    try {
        return String.format("%f", dividend / divisor);
    } catch (java.lang.ArithmeticException e) {
        return "Division durch 0"
    }
}
  
static String Division3(float dividend, float divisor) {
    if (divisor == 0)
        throw new java.lang.ArithmeticException("Division durch 0");
    return String.format("%f", dividend / divisor);
}

public static void main(String[] args) {
    System.out.println(Division1(1,0));
    System.out.println(Division2(1,0));
    System.out.println(Division3(1,0));
}

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Delphi-Laie
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1508
Erhaltene Danke: 211


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 25.07.17 15:35 
Vielen Dank Euch beiden Helfern!

Zwar verstand ich Th69s Hilfe nicht so recht, aber "irgendwie" bekam ich es jetzt dank Eurer Hilfe hin, daß die Eclipse nichts mehr auszusetzen hat und nunmehr compiliert.
Delphi-Laie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1508
Erhaltene Danke: 211


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 25.07.17 17:36 
Leute, entschuldigt bitte, daß ich noch um einen Nachschlag bitte. Fehler abzufangen ist bei dem Algorithmus anscheinend sinnvoll, um unzulässige Eingaben adäquat zu behandeln. "e.getMessage()" gibt nur einen Integerwert zurück. Kann man sich auch den dazugehörigen String anzeigen bzw. ausgeben lassen? Natürlich habe ich schon gesucht, bin aber nicht recht schlaugeworden. Weder toString noch getLocalizedMessage geben eine textuelle Fehlermeldung aus.

Danke und Gruß

Delphi-Laie
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1844
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 25.07.17 17:59 
Die Methode getMessage() kann nur eine Fehlermeldung ausgeben, und keinen Fehlercode oder sonstigen Zahlenwert:

String java.lang.Throwable.getMessage() hat folgendes geschrieben:
Returns: the detail message string of this Throwable instance (which may be null).

Also muss der Integerwert von wo anders herkommen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Delphi-Laie