Diese FAQ bezieht sich auf Fehlermeldungen, die immer wieder
auftauchen - vorallem wenn man Java-Neuling ist. Weil bestimmte
Dinge immer wieder hier gefragt werden, nun mal eine Zusammenfassung.
Bevor es jetzt aber an die einzelnen Fehler geht, mal ein kleines Vorwort
dazu:
Java stellt Fehler als sogenannte "Exceptions" dar, d.h. irgendeine
Methode/Operation "wirft" einen Fehler, weil was nicht passt.
Eine solche Fehlermeldung ist eigentlich immer gleich aufgebaut,
und zwar wird in der Ausgabe (Shell/Dos-Fenster bzw. ein Konsolen-Fenster
in einer IDE) der sogenannte "Stack Trace" angezeigt.
Das ist auf deutsch gesagt einfach eine Liste, die alle sequentiellen
Methoden-Aufrufe/spezielle Operationen chronologisch anzeigt.
Wobei der oberste Eintrag der "neueste" ist.
In der ersten Zeile einer jeden Fehlermeldung steht also, wo
dieser Fehler im Endeffekt aufgetreten ist.
Die Zeilen beinhalten eig. alle Infos, die man braucht:
Es steht der Name der aufgerufenen Methode bzw der Operation da,
in welcher Klasse das ganze passiert ist, und auch noch die exakte
Zeilennummer, in der der Fehler aufgetreten ist.
Ausserdem der Name des Fehlers selbst, der meistens auch Sinn macht.
Oftmals schlängelt sich ein Fehler durch mehrere Methoden durch,
bis sein Effekt zum Tragen kommt. Dafür eben der Stack Trace, der mehr
beinhaltet als nur den letzten Aufruf. Man kann dort also zeilenweise
runterlesen und kucken, wo denn die Ursache des Fehlers liegt.
Denn wo ein Fehler im Endeffekt auftritt, und wo die eigentliche
Ursache dafür liegt (irgendwo passiert etwas, was der Programmierer
so nicht geplant hatte), sind oft zwei verschiedene Dinge.
Nun gut, soviel zu den Fehlermeldungen. Das ist ein super System
was Java da hat, man sollte sich damit anfreunden und sich mit den
netten Stack Traces beschäftigen, statt gleich aufzugeben. Sie enthalten
wie gesagt eig. alle Infos.
Nun zu den häufigsten Fehlern im Einzelnen:
IndexOutOfBoundsException:
Einen Index gibt es nur bei iterierbaren Datenstrukturen, also
Arrays, Listen usw.
OutOfBounds heisst übersetzt sowas wie "sprengt den Rahmen".
Der Fehler tritt in 90% der Fälle bei einem Array auf, typisches
Bsp wie es jedem Anfänger mindestens einmal passiert:
Der Index ist hier die "1". Das ist OutOfBounds, weil Java immer bei
0 anfängt zu zählen. Wir haben ein Array mit nur einem Fach erstellt,
das heisst es gibt nur das eine Fach mit Index 0. Nicht 1, das wäre schon
ein Array der Länge zwei.
Also der Fehler heisst einfach: Dieses Fach, auf dass du zugreifst, gibt
es nicht.
Lösung: Überprüfe nochmal genau den Index, überlege wo
hier zB in Schleifen ein Wert rauskommen kann, der negativ ist oder
grösser als die Array-Länge.
NullPointerException:
Auch bei schon fortgeschrittenen Programmierern sehr beliebt
Der Fehler bedeutet, dass auf ein Objekt zugegriffen wird, das "null"
ist. Unter Anfängern sehr oft deswegen, weil man vergessen hat
das Objekt zu initialisieren.
Bsp:
Zugreifen heisst also eine Methode darauf anwenden, oder
ein Attribut abzufragen.
(So ein Fehler kommt noch nicht, wenn man nur ein null-Objekt zB
über verschiedene Methoden hin- und herreicht!)
Ein Array erstellen heisst noch lange nicht,
dass man Autos hat. Man hat nur einen Container, der Autos speichern
kann.
Lösung:
Der Stack Trace zeigt dir ja schon die Zeile, inder du etwas mit einem
null-Objekt tust. Überlege, warum das Objekt null ist, wie das sein kann,
und korrigiere deinen Code.
Konkret ist das eben entweder eine Initialisierung, oder eine if-Abrage:
Cannot find symbol...
Dieser Fehler heisst, dass beim Compilieren des Quell-Codes auf
eine Variable gestossen wurde, die nirgendswo definiert wurde.
Bsp:
Das gilt auch für Methoden. Bei Anfängern kommt der Fehler häufig
weil sie vergessen bestimmte Dinge aus Java-Paketen zu importieren,
sodass Java damit nix anfangen kann.
..Oder weil sie sich schlichtweg vertippen, und mal einen kleinen
Buchstaben im Aufruf einer Methode vergessen.
Lösung:
Die Meldung benennt dir konkret, was nicht definiert wurde.
Nach Tippfehlern im Code suchen!
Oder ein nötiges import einfügen, oder kucken dass man die
Variable halt definiert.
non-static method can't be referenced from a static context
...oder alles was die Worte non-static und static kombiniert
(es gibt da glaub ich mehrere Exceptions).
Siehe dazu:
http://www.java-forum.org.server659-han.de-nserver.de/showthread.php?t=7200
So, ich glaube das war's. Wenn noch was fehlt, bitte PN an mich.
Und wie schon gesagt: Lernt, mit Fehlermeldungen umzugehen.
Es gibt insgesamt gefühlte 500+ Exceptions allein in der Standard-API.
Auswendig kann die keiner alle, aber wenn man gelernt hat den
Stack Trace zu lesen, kriegt man alles hin.
auftauchen - vorallem wenn man Java-Neuling ist. Weil bestimmte
Dinge immer wieder hier gefragt werden, nun mal eine Zusammenfassung.
Bevor es jetzt aber an die einzelnen Fehler geht, mal ein kleines Vorwort
dazu:
Java stellt Fehler als sogenannte "Exceptions" dar, d.h. irgendeine
Methode/Operation "wirft" einen Fehler, weil was nicht passt.
Eine solche Fehlermeldung ist eigentlich immer gleich aufgebaut,
und zwar wird in der Ausgabe (Shell/Dos-Fenster bzw. ein Konsolen-Fenster
in einer IDE) der sogenannte "Stack Trace" angezeigt.
Das ist auf deutsch gesagt einfach eine Liste, die alle sequentiellen
Methoden-Aufrufe/spezielle Operationen chronologisch anzeigt.
Wobei der oberste Eintrag der "neueste" ist.
In der ersten Zeile einer jeden Fehlermeldung steht also, wo
dieser Fehler im Endeffekt aufgetreten ist.
Die Zeilen beinhalten eig. alle Infos, die man braucht:
Es steht der Name der aufgerufenen Methode bzw der Operation da,
in welcher Klasse das ganze passiert ist, und auch noch die exakte
Zeilennummer, in der der Fehler aufgetreten ist.
Ausserdem der Name des Fehlers selbst, der meistens auch Sinn macht.
Oftmals schlängelt sich ein Fehler durch mehrere Methoden durch,
bis sein Effekt zum Tragen kommt. Dafür eben der Stack Trace, der mehr
beinhaltet als nur den letzten Aufruf. Man kann dort also zeilenweise
runterlesen und kucken, wo denn die Ursache des Fehlers liegt.
Denn wo ein Fehler im Endeffekt auftritt, und wo die eigentliche
Ursache dafür liegt (irgendwo passiert etwas, was der Programmierer
so nicht geplant hatte), sind oft zwei verschiedene Dinge.
Nun gut, soviel zu den Fehlermeldungen. Das ist ein super System
was Java da hat, man sollte sich damit anfreunden und sich mit den
netten Stack Traces beschäftigen, statt gleich aufzugeben. Sie enthalten
wie gesagt eig. alle Infos.
Nun zu den häufigsten Fehlern im Einzelnen:
IndexOutOfBoundsException:
Einen Index gibt es nur bei iterierbaren Datenstrukturen, also
Arrays, Listen usw.
OutOfBounds heisst übersetzt sowas wie "sprengt den Rahmen".
Der Fehler tritt in 90% der Fälle bei einem Array auf, typisches
Bsp wie es jedem Anfänger mindestens einmal passiert:
Code:
int[] myArray = new int[1];
myArray[1] = 4;
Der Index ist hier die "1". Das ist OutOfBounds, weil Java immer bei
0 anfängt zu zählen. Wir haben ein Array mit nur einem Fach erstellt,
das heisst es gibt nur das eine Fach mit Index 0. Nicht 1, das wäre schon
ein Array der Länge zwei.
Also der Fehler heisst einfach: Dieses Fach, auf dass du zugreifst, gibt
es nicht.
Lösung: Überprüfe nochmal genau den Index, überlege wo
hier zB in Schleifen ein Wert rauskommen kann, der negativ ist oder
grösser als die Array-Länge.
NullPointerException:
Auch bei schon fortgeschrittenen Programmierern sehr beliebt
Der Fehler bedeutet, dass auf ein Objekt zugegriffen wird, das "null"
ist. Unter Anfängern sehr oft deswegen, weil man vergessen hat
das Objekt zu initialisieren.
Bsp:
Code:
Auto[] meineAutos = new Auto[1];
meineAutos[0].getPS(); // <- BAEM
Zugreifen heisst also eine Methode darauf anwenden, oder
ein Attribut abzufragen.
(So ein Fehler kommt noch nicht, wenn man nur ein null-Objekt zB
über verschiedene Methoden hin- und herreicht!)
Ein Array erstellen heisst noch lange nicht,
dass man Autos hat. Man hat nur einen Container, der Autos speichern
kann.
Lösung:
Der Stack Trace zeigt dir ja schon die Zeile, inder du etwas mit einem
null-Objekt tust. Überlege, warum das Objekt null ist, wie das sein kann,
und korrigiere deinen Code.
Konkret ist das eben entweder eine Initialisierung, oder eine if-Abrage:
Code:
if(myAutos[0] != null){
myAutos[0].getPS();
}
Cannot find symbol...
Dieser Fehler heisst, dass beim Compilieren des Quell-Codes auf
eine Variable gestossen wurde, die nirgendswo definiert wurde.
Bsp:
Code:
public static void main(String[] args){
int y = 2;
int z = x+y; // cannot find symbol "x"
}
Das gilt auch für Methoden. Bei Anfängern kommt der Fehler häufig
weil sie vergessen bestimmte Dinge aus Java-Paketen zu importieren,
sodass Java damit nix anfangen kann.
..Oder weil sie sich schlichtweg vertippen, und mal einen kleinen
Buchstaben im Aufruf einer Methode vergessen.
Lösung:
Die Meldung benennt dir konkret, was nicht definiert wurde.
Nach Tippfehlern im Code suchen!
Oder ein nötiges import einfügen, oder kucken dass man die
Variable halt definiert.
non-static method can't be referenced from a static context
...oder alles was die Worte non-static und static kombiniert
(es gibt da glaub ich mehrere Exceptions).
Siehe dazu:
http://www.java-forum.org.server659-han.de-nserver.de/showthread.php?t=7200
So, ich glaube das war's. Wenn noch was fehlt, bitte PN an mich.
Und wie schon gesagt: Lernt, mit Fehlermeldungen umzugehen.
Es gibt insgesamt gefühlte 500+ Exceptions allein in der Standard-API.
Auswendig kann die keiner alle, aber wenn man gelernt hat den
Stack Trace zu lesen, kriegt man alles hin.