Fehlermeldungen (Java)
Aus Infostudium Wiki
Inhaltsverzeichnis |
javac-Meldungen (beim compilieren)
Allgemeine Hinweise
In den Fehlermeldungen ist immer auch der Dateiname und die Zeilennummer des Fehlers angeben. Somit kann man in den meisten Fällen, mit ein wenig Übung, einen Fehler recht schnell finden, auch wenn er hier nicht in der Liste steht. Zusätzlich wird auch mit location angeben wo in der Zeile sich der Fehler befindet. Dazu dient der kleine '^' Marker. Manchmal ist die angebene Position aber auch falsch, z.B. liegt der Fehler dann in der darüber liegenden Zeile etc. In den meisten Fällen aber zumindest in der Nähe.
Häufig produzieren Syntaxfehler auch weitere Syntaxfehler. Dies gilt insbesondere für fehlende Klammern. Daher macht es in den meisten Fällen (nicht immer) Sinn, die Fehler von oben nach unten abzuarbeiten. Wie bereits gesagt: Das finden von Fehlern erfordert etwas Übung und Erfahrung.
Häufige Fehlermeldungen
Test.java:1: class HelloWorld is public, should be declared in a file named HelloWorld.java
Der Name einer Datei muss mit dem Namen der Klasse in der Datei identisch sein. Groß-/Kleinschreibung ist relevant. Es ist nicht möglich zwei von einander getrennte Klassen innerhalb einer Datei zu deklarieren. Schreibe jede Klasse in eine eigene Datei.Test.java:6: incompatible types found : xxxxx required: yyyyy
Eine Variable eines Typs wurde einem anderen nicht kompatiblen Typ zugewiesen. Beispielsweise wurde ein Double-Wert einem String zugewiesen oder umgekehrt. Dieser Fehler kann ebenfalls auftreten, wenn beispielsweise innerhalb einer if-Anweisung anstatt dem Vergleichsoperator '==' der Zuweisungsoperator '=' verwendet wurde.Test.java:14: cannot find symbol
Der Compilier erkennt irgendeinen Bezeichner in deinem Quellcode nicht. Häufig handelt es sich nur um einen einfachen Tippfehler. Es kann aber auch sein, das du z.B. System.println("blabla") geschrieben hast, anstatt System.out.println("blabla"). Der Precompiler erkennt in diesem Fall das println nicht.Test.java:26: ';' expected
In der angebenen Zeile wird ein Semikolon erwartet. Meistens fehlt einfach nur das Semikolon in der vorhergehenden Zeile. Der Fehler kann aber auch viele andere Ursachen haben.Test.java:12: '{' expectedbzw.Test.java:13: '}' expected
Irgendwo, d.h. nicht umbedingt an der angegebenen Stelle, fehlt eine geschweifte Klammer. Die genaue Stelle ist für den Compiler häufig nicht zu finden. Der beste Weg die Stelle zu finden ist, den kompletten Quellcode korrekt einzurücken. Dann wird einem Stelle sofort ins Auge fallen. Hilfreich sind auch Editoren wie KWrite (Linux) oder Notepad2 (Windows), die, wenn sich der Cursor über einer Klammer befindet, die jeweils zugehörige Klammer aufleuchten lassen.
java-Meldungen (beim ausführen)
Allgemeine Hinweise
Einige Fehler können vom Compiler nicht festgestellt werden und werden daher erst zur Laufzeit bemerkt. In diesem Fall wird eine sogenannte Exception geworfen. Sehr hilfreich bei der Fehlersuche ist der Aufruf-Stack:
at java.lang.String.charAt(String.java:558)
at Test.ausgabe(Test.java:5)
at Test.main(Test.java:9)
An diesem Beispiel kann man ablesen, dass in der Methode main() der Klasse Test in Zeile 9 die Methode ausgabe() der selben Klasse aufgerufen wurde. Diese wiederum hat in Zeile 5 die Methode charAt() der Klasse String aufgerufen, usw. Die oberste Methode im Aufrufstack hat den Fehler verursacht. Da aber die Klasse String keine eigene ist und zur Java-Bibliothek gehört ist der Fehler also mit hoher Wahrscheinlichkeit in der Methode ausgabe() in Zeile 5 zu suchen.
Häufige Exceptions
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.charAt(String.java:558) at Test.ausgabe(Test.java:5) at Test.main(Test.java:9)Es wurde versucht auf ein einzelnes Zeichen eines Strings zu zugreifen. Das ist natürlich möglich, jedoch darf dabei der Zugriffsindex nicht außerhalb des zulässigen Bereichs liegen. Das erste Zeichen eines Strings hat den Index 0, das letzte Zeichen hat den Index n-1, wenn n die Länge des Strings ist. Dazwischen ist der Zugriff erlaubt. Hat der String die Länge 0, so ist demnach auch kein Index zulässig.
Hilfreich bei der Fehlersuche ist der ausgegebene Index der den Fehler verursacht hat. Im obigen Beispiel ist dies die -1.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Test.main(Test.java:5)Es wurde versucht auf Elemente außerhalb der Grenzen des Arrays zuzugreifen. Der zulässige Bereich beginnt bei 0 und geht bis n-1, wenn das Array n Elemente enthält.
Auch hier wird wieder der Index ausgegeben der den Fehler verursacht hat.Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:5)Der Versuch auf eine Objektrefernz zu zugreifen, die den Wert null enthält. Die Referenz muss entweder mit einer anderen Referenz oder mit dem new-Operator initialisiert werden. Der Fehler kann auch im Zusammenhang mit Hüllklassen auftreten, dazu ein Beispiel:
public class Test { public static void main(String[] args) { Integer[] array = new Integer[5]; int i = array[0]; // <-- hier tritt die Exception auf System.out.println(i); } }Arrays werden in Java standardmäßig mit 0 bzw. null initialisiert. Daher kommt beim Compilieren keine Meldung vom Typ "variable *** might not have been initialized". Wird dann versucht mit dem Integer-Objekt zu arbeiten tritt die Exception auf.
Exception in thread "main" java.lang.ArithmeticException: / by zero at Test.main(Test.java:3)Es ist eine Division durch 0 aufgetreten. Dies kann beispielsweise bei int-Werten auftreten. Diese Exception wird dagegen bei float oder double-Werten nicht geworfen. Dort ist das Ergebnis Infinity bzw. -Infinity.Exception in thread "main" java.lang.ClassCastException: MyTestClass at Test.main(Test.java:24)Es wurde versucht ein Objekt von einer Subklasse zu einer anderen Subklasse zu casten, die jedoch in einem anderen Zweig des Ableitungsbaumes liegt. Hier ein Beispiel, welches diese Exception produziert:
class A { } class B extends A { } class C extends A { } public class Test { public static void main(String[] args) { A a = new B(); C c = (C)a; // <-- hier tritt die Exception auf } }Mit dem instanceof-Operator kann man testen, ob man gefahrlos ein Objekt einer Klasse zu einer anderen Klasse casten kann.Exception in thread "main" java.lang.NoSuchMethodError: main
Jede Klasse die du ausführen willst, benötigt eine main-Methode. Diese Methode wird von java als erstes aufgerufen. Sie ist also der Eintrittspunkt der Anwendung. Dein komplettes Programm findet innerhalb dieser Methode statt. Sie muss wie folgt deklariert werden:
public static void main(String[] args) { // dein Quellcode.. }Es ist nicht möglich, eigene Parameter hinzufügen oder den Rückgabetyp zu ändern. Ebenso muss die Methode public und static sein.
Benutzung von Eclipse
Allgemeine Hinweise
Grundsätzlich rate ich von der Verwendung von einer IDE ab. Du solltest bedenken, dass du in der Klausur die Programme von Hand auf Papier schreiben musst! D.h. dort greift dir keine IDE unter die Arme und erzeugt dir z.B. eine Klasse mit fertigen Methodenköpfen etc..... unterschätzte das nicht! Wer jedoch trotzdem eine IDE verwenden möchte darf das natürlich tun, dabei ist z.B. Eclipse eine recht gute Wahl.
Probleme mit Eclipse 3.1
- Eclipse 3.1 compiliert in der Standardeinstellung mit JDK 1.4, auch wenn eigentlich eine aktuellere Version installiert ist. Sobald der zu compilierende Quellcode nun Features verwendet die in 1.4 noch nicht vorhanden waren, treten beim compilieren Fehler auf. Dies kann man aber leicht umgehen, indem man Eclipse richtig konfiguriert:
Window -> Preferences... und dort Java -> Compiler. Im Feld JDK Compliance die Einstellungen Compiler compliance level (auf 5.0 stellen) und Use default compliance settings (aktivieren).
--Coolcat 19:32, 13. Okt 2006 (CEST)
