Autor Beitrag
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 24.07.17 18: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.07.17 18:33 
- Nachträglich durch die Entwickler-Ecke gelöscht -

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


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 24.07.17 19: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: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 24.07.17 20: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 24.07.17 20:29 
- Nachträglich durch die Entwickler-Ecke gelöscht -

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


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 25.07.17 16: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: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Di 25.07.17 18: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
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 25.07.17 18:59 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: Delphi-Laie