Autor |
Beitrag |
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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:
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:
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 Th69: Quote-Tags hinzugefügt
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 24.07.17 18:33
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: Delphi-Laie
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Mo 24.07.17 19:42
Danke für Deine prompte Antwort, Frühlingsrolle!
Frühlingsrolle hat folgendes geschrieben : | 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".
Frühlingsrolle hat folgendes geschrieben : | oder erzeuge in der HelloWorld Klasse ein Objekt von DuelMerge, bevor du die Merge-Methoden aufrufst. |
Damit komme ich weiter:
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 Th69: Code-Tags hinzugefügt
|
|
Th69
Beiträge: 4777
Erhaltene Danke: 1054
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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
|
Verfasst: Mo 24.07.17 20:29
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: Delphi-Laie
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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
|
Verfasst: Di 25.07.17 18:59
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: Delphi-Laie
|
|
|