Entwickler-Ecke

Alle Sprachen - Alle Plattformen - Aufruf einer Java-Prozedur in einer Java-Klasse


Delphi-Laie - Mo 24.07.17 18:17
Titel: Aufruf einer Java-Prozedur in einer Java-Klasse
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:


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:


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


Delete - Mo 24.07.17 18:33

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delphi-Laie - 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:

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 - 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? [https://stackoverflow.com/questions/15457486/error-unhandled-exception-type-exception]


Delete - Mo 24.07.17 20:29

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delphi-Laie - 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 - 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


Delete - Di 25.07.17 18:59

- Nachträglich durch die Entwickler-Ecke gelöscht -