Javakurs/Übungsaufgaben/Errors: Unterschied zwischen den Versionen
(→'''LaufzeitFehler''') |
Jörg F (Diskussion | Beiträge) K (hat „Javakurs2007/Errors“ nach „Javakurs/Übungsaufgaben/Errors“ verschoben) |
||
(19 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | Ihr findet hier eine kurze Erklärung mit Lösungsansatz zu den häufigsten Compiler- und Laufzeitfehlern. Versucht diese Fehlermeldungen bitte immer zu lesen, Java gibt euch relativ aufschlussreiche Fehlermeldungen, sodass es durchaus möglich ist, von der Meldung auf den tatsächlichen Fehler zu schließen! | ||
+ | |||
='''CompilerFehler'''= | ='''CompilerFehler'''= | ||
− | + | == Exception in thread "main" java.lang.NoClassDefFoundError == | |
+ | Beim Kompilieren (von Datei X.java, welche ein Objekt Y aus der Datei Y.class/Y.java einbinden will: | ||
+ | X.java:5: cannot resolve symbol | ||
+ | symbol : class Y | ||
+ | location: class X | ||
+ | Y y = new Y(); | ||
+ | ^ | ||
+ | |||
+ | :Mann kann das Problem auf zwei Arten lösen: | ||
+ | :* man schreibt ''"java -cp . Klasse"'' anstatt nur ''"java Klasse"'' um sie Auszuführen | ||
+ | :* verwendet man die bash: schreibt man ''export CLASSPATH=$CLASSPATH:.'' entweder in jeder shell einmal oder in die ''.bashrc'' eintragen und die shell mit ''exec bash'' neu starten. | ||
+ | :* verwendet man die tcsh: schreibt man ''setenv CLASSPATH ".:$CLASSPATH"'' entweder in jeder shell oder einmal in der ''.cshrc'' eintragen und die shell mit ''tcsh'' neu starten. | ||
+ | |||
+ | :Der Fehler bedeutet, dass die Shell-Variable CLASSPATH gesetzt ist. Das hat zur Folge das Java den Standardwert "." (das Verzeichnis in dem man gerade ist) nicht mehr in den CLASSPATH aufnimmt und diese Fehlermeldung auflöst. | ||
+ | |||
+ | |||
+ | == Fehlermeldung "unchecked or unsafe operations" == | ||
+ | |||
+ | Note: Test.java uses unchecked or unsafe operations. | ||
+ | Note: Recompile with -Xlint:unchecked for details. | ||
+ | :Dann könnt ihr die entweder ignorieren, oder aber ihr übergebt den zusätzlichen Parameter an den Java-Compiler (javac -Xlint:unchecked foo.java). | ||
+ | Normalerweise sollte man solche Konstrukte natürlich vermeiden, dazu ist ja die Fehlermeldung da, aber für den Kurs ist das erstmal nicht weiter wichtig. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | == non-static method someMethod() cannot be referenced from a static context == | ||
+ | pepino felixf 3 (~/Desktop): javac Test.java | ||
+ | Test.java:13: non-static method someMethod() cannot be referenced from a static context | ||
+ | someMethod(); | ||
+ | ^ | ||
+ | 1 error | ||
+ | |||
+ | Diese Fehler tritt auf, wenn eine Objectmethode wie eine statische Methode aufgerufen wird, d.h. die Methode wir nicht auf eine Objekt aufgerufen, sondern wie eine statische Methode ohne Punktoperator. | ||
+ | Lösung: | ||
+ | FooBar name = new FooBar(); | ||
+ | name.someMethod(); | ||
+ | |||
+ | |||
+ | ==Falsche Parameter== | ||
+ | bruja shabanov 23 (Desktop/JavaKurs): javac Errors.java | ||
+ | Errors.java:4: setANumber(int) in Errors cannot be applied to (java.lang.String) | ||
+ | setANumber("aNumber"); | ||
+ | ^ | ||
+ | 1 error | ||
+ | *Dieser Fehler tritt auf wenn ihr z.B. bei einem Methodenaufruf Parameter eines falschen Typs übergebt. | ||
+ | *Hier erwartet die Methode setANumber eine Zahl vom Typ int, bekommt aber einen String. Das geht nicht. | ||
+ | |||
+ | |||
+ | |||
+ | ==Inkompatible Typen== | ||
+ | bruja shabanov 18 (Desktop/JavaKurs): javac Errors.java | ||
+ | Errors.java:6: incompatible types | ||
+ | found : java.lang.String | ||
+ | required: double | ||
+ | double aDouble = anInt + aString; | ||
+ | ^ | ||
+ | 1 error | ||
+ | *Dieser Fehler tritt dann auf, wenn bei einer Zuweisung die Datentypen der Variablen nicht übereinstimmen, wie in diesem fehlerhaften Code: | ||
+ | String aString= "47"; | ||
+ | int anInt = 11; | ||
+ | double aDouble = anInt + aString; | ||
+ | *Es ist zwar möglich, aus einer Zahl einen String zu erzeugen und umgekehrt. Da dies aber relativ kompliziert ist, behandeln wir das im Rahmen dieses Kurses nicht. Versucht einfach, Zahlen mit Zahlen und Strings mit Strings zu verknüpfen, dann wird euch auch der Compiler danken. | ||
+ | |||
+ | |||
+ | |||
==Klammer fehlt== | ==Klammer fehlt== | ||
Zeile 9: | Zeile 76: | ||
1 error | 1 error | ||
* Es fehlt einfach eine geschweifte Klammer. | * Es fehlt einfach eine geschweifte Klammer. | ||
− | * Jedes | + | * Jedes Mal, wenn ihr eine geschweifte Klammer aufmacht, macht sie gleich wieder zu, damit ihr das später nicht vergesst. |
− | * Bei Klammerfehlern solltet ihr nach jedem korrigierten Fehler | + | * Bei Klammerfehlern solltet ihr nach jedem korrigierten Fehler neu kompilieren, da es normalerweise zu sehr vielen Folgefehlern kommt. |
+ | |||
+ | |||
+ | ==Semikolon fehlt== | ||
+ | bruja shabanov 25 (Desktop/JavaKurs): javac Errors.java | ||
+ | Errors.java:5: ';' expected | ||
+ | } | ||
+ | ^ | ||
+ | 1 error | ||
+ | *Es fehlt einfach ein Semikolon. | ||
+ | *Sucht ''vor'' der angegebenen Zeile nach einer Anweisung, die kein Semikolon am Ende hat. | ||
+ | |||
==Doppelte Deklaration== | ==Doppelte Deklaration== | ||
Zeile 21: | Zeile 99: | ||
int i = .. | int i = .. | ||
* Ihr müsst dann den Variablennamen in der Schleife z.B. ändern. | * Ihr müsst dann den Variablennamen in der Schleife z.B. ändern. | ||
+ | |||
Zeile 29: | Zeile 108: | ||
^ | ^ | ||
1 error | 1 error | ||
− | * Ihr habt eine Variable nicht richtig initialisiert, das passiert oft wenn ihr einer Variable innerhalb einer if-Anweisung Werte zuweist, wie in diesem Code ( der zudem obigen Fehler führt ): | + | * Ihr habt eine Variable nicht richtig initialisiert, das passiert oft, wenn ihr einer Variable innerhalb einer if-Anweisung Werte zuweist, wie in diesem Code (der zudem obigen Fehler führt): |
public static String someMethod( int x ){ | public static String someMethod( int x ){ | ||
String ret; | String ret; | ||
Zeile 37: | Zeile 116: | ||
return ret; | return ret; | ||
} | } | ||
− | * Die Variable ret bekommt nur dann einen Wert zugeordnet wenn x == 4711 gilt, da dies nicht immer der Fall sein muss, könnte der Fall auftreten, dass ret gar keinen Wert zugeordnet bekommt. | + | * Die Variable <code>ret</code> bekommt nur dann einen Wert zugeordnet, wenn x == 4711 gilt, da dies nicht immer der Fall sein muss, könnte der Fall auftreten, dass <code>ret</code> gar keinen Wert zugeordnet bekommt. |
− | * Fügt einen default Wert für ret hinzu um diesen Fehler zu beheben, z.B. so: | + | * Fügt einen default-Wert für <code>ret</code> hinzu um diesen Fehler zu beheben, z.B. so: |
String ret = ""; | String ret = ""; | ||
+ | ==verwirrender Vergleichsfehler== | ||
+ | Hangman.java:36: unexpected type | ||
+ | required: variable | ||
+ | found : value | ||
+ | if (wort.charAt(i) = buchstabe) { | ||
+ | *Statt einem Vergleich hat man den Wert überspeichert und ein verwirrender Fehler ergötzt sich unser. | ||
==Missing return statement== | ==Missing return statement== | ||
Zeile 48: | Zeile 133: | ||
^ | ^ | ||
1 error | 1 error | ||
− | * Ihr habt in einer Methode, die etwas zurückgeben soll entweder das return vergessen, oder das return steht nur innerhalb von if Anweisungen, wie hier: | + | * Ihr habt in einer Methode, die etwas zurückgeben soll, entweder das return vergessen, oder das return steht nur innerhalb von if-Anweisungen, wie hier: |
public static boolean isPositive( int num ){ | public static boolean isPositive( int num ){ | ||
if( num > 0 ){ | if( num > 0 ){ | ||
Zeile 56: | Zeile 141: | ||
} | } | ||
} | } | ||
− | * Da alle returns in einem if Block stehen, könnte es theoretisch sein, dass keiner der Blöcke ausgeführt wird und Java somit nicht | + | * Da alle returns in einem if-Block stehen, könnte es theoretisch sein, dass keiner der Blöcke ausgeführt wird und Java somit nicht weiß, was es zurück geben soll. |
− | * Fügt um das Problem zu | + | * Fügt, um das Problem zu lösen, ein return am Ende eurer Methode ein, oder ändert ein else if in ein else. |
public static boolean isPositive( int num ){ | public static boolean isPositive( int num ){ | ||
if( num > 0 ){ | if( num > 0 ){ | ||
Zeile 67: | Zeile 152: | ||
} | } | ||
− | =''' | + | ='''Laufzeit-Fehler oder Exceptions (sprich Äkssepschons)'''= |
Zeile 74: | Zeile 159: | ||
bruja shabanov 7 (Desktop/JavaKurs): java Errors | bruja shabanov 7 (Desktop/JavaKurs): java Errors | ||
Exception in thread "main" java.lang.NoClassDefFoundError: Errors | Exception in thread "main" java.lang.NoClassDefFoundError: Errors | ||
− | * | + | * Das heißt, Java kann die Klasse nicht finden, die ihr ausführen wollt. |
− | * Schaut '''genau''' nach ob der Dateiname und der Klassennamme gleich sind. Dabei ist auch wichtig die Groß/ | + | * Schaut '''genau''' nach, ob der Dateiname und der Klassennamme gleich sind. Dabei ist auch wichtig, die Groß-/Kleinschreibung zu beachten. Außerdem achtet darauf, ob ihr in die Konsole die richtigen Namen eingetippt habt. |
Zeile 81: | Zeile 166: | ||
bruja shabanov 9 (Desktop/JavaKurs): java Errors | bruja shabanov 9 (Desktop/JavaKurs): java Errors | ||
Exception in thread "main" java.lang.NoSuchMethodError: main | Exception in thread "main" java.lang.NoSuchMethodError: main | ||
− | * Java findet eine Methode nicht ( hier speziell die main Methode ) | + | * Java findet eine Methode nicht (hier speziell die main Methode). |
− | * Schaut ob ihr beim Aufruf den Methodennamen richtig geschrieben habt. | + | * Schaut, ob ihr beim Aufruf den Methodennamen richtig geschrieben habt. |
Zeile 89: | Zeile 174: | ||
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 | Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 | ||
at Errors.main(Errors.java:5) | at Errors.main(Errors.java:5) | ||
− | *Ihr versucht auf ein Array Feld zuzugreifen, was | + | *Ihr versucht, auf ein Array Feld zuzugreifen, was außerhalb der Größe des Arrays liegt. |
− | *Sucht in der angegeben Zeile nach dem Zugriff auf das Array und | + | *Sucht in der angegeben Zeile nach dem Zugriff auf das Array und stellt fest, warum der Index zu groß geworden ist. |
+ | *"Printline-Debugging" hilft (Index vor jedem Zugriff ausgeben)! | ||
Zeile 97: | Zeile 183: | ||
Exception in thread "main" java.lang.NullPointerException | Exception in thread "main" java.lang.NullPointerException | ||
at Errors.main(Errors.java:5) | at Errors.main(Errors.java:5) | ||
− | *Ihr versucht auf eine Variable zuzugreifen oder führt mit ihr Operationen aus, obwohl sie noch nicht initialisiert ist. | + | *Ihr versucht, auf eine Variable zuzugreifen oder führt mit ihr Operationen aus, obwohl sie noch nicht initialisiert ist. |
− | *Das passiert oft wenn man mit z.B. String Arrays arbeitet. Obwohl man das Array initialisiert sind die Elemente darin noch nicht initialisiert. | + | *Das passiert oft, wenn man mit z.B. String-Arrays arbeitet. Obwohl man das Array initialisiert hat, sind die Elemente darin noch nicht initialisiert. |
String[] stringArray = new String[12]; | String[] stringArray = new String[12]; | ||
− | *Hier kann es helfen, den Array Elementen entweder direkt Werte zuzuweisen oder mit einer Schleife alle auf einen default Wert setzen: | + | *Hier kann es helfen, den Array-Elementen entweder direkt Werte zuzuweisen oder mit einer Schleife alle auf einen default-Wert setzen: |
for(int i = 0 ; i < stringArray.length ; i++ ){ | for(int i = 0 ; i < stringArray.length ; i++ ){ | ||
stringArray[i] = ""; | stringArray[i] = ""; | ||
Zeile 109: | Zeile 195: | ||
Exception in thread "main" java.lang.ArithmeticException: / by zero | Exception in thread "main" java.lang.ArithmeticException: / by zero | ||
at Errors.main(Errors.java:4) | at Errors.main(Errors.java:4) | ||
− | *Dieser Fehler tritt auf, wenn ihr versucht ungültige arithmetische Operationen auszuführen, wie hier die Division durch 0. | + | *Dieser Fehler tritt auf, wenn ihr versucht, ungültige arithmetische Operationen auszuführen, wie hier die Division durch 0. |
− | *Ihr könnt euch Gedanken über das axiomatische Gerüst der Mathematik machen und nach einem Weg suchen durch 0 zu teilen, einfacher ist es jedoch, wenn ihr | + | *Ihr könnt euch Gedanken über das axiomatische Gerüst der Mathematik machen und nach einem Weg suchen, durch 0 zu teilen, einfacher ist es jedoch, wenn ihr nicht durch 0 teilt, keine Wurzeln aus negativen Zahlen zieht usw. |
+ | |||
+ | |||
+ | == java.lang.StackOverflowError == | ||
+ | Exception in thread "main" java.lang.StackOverflowError | ||
+ | |||
+ | Diese Fehler tritt auf, wenn ihr eine Endlosrekursion produziert habt. Im Zweifelsfall seht ihr diese Fehlermeldung aber nicht, da nach dieser der Bildschirm endlos mit der Zeilenangabe vollgeschrieben wird. | ||
+ | |||
+ | == Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit == | ||
+ | pepino felixf 17 (~/Desktop): java Test | ||
+ | Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit | ||
+ | |||
+ | Ihr solltet etwas sorgsamer mit eurem Speicherplatz (RAM) umgehen ;-) | ||
+ | |||
+ | == Exception in thread "main" java.lang.NoClassDefFoundError == | ||
+ | Exception in thread "main" java.lang.NoClassDefFoundError:KlassennameDenIhrGeradeKompiliertHabt | ||
+ | Die Lösung dieses Fehlers verhält sich äquivalent wie der NoClassDefFoundError zur Compile-Zeit, welche weiter oben beschrieben wird. | ||
+ | |||
+ | Sollte der CLASSPATH korrekt gesetzt sein und sich eure Java-Dateien alle am richtigen Ort befinden, so könnte es trotzdem sein, dass eine Klasse nicht gefunden wird: | ||
+ | |||
+ | Exception in thread "main" java.lang.NoClassDefFoundError:KlassennameDenIhrGeradeKompiliertHabt/class | ||
+ | :dann habt ihr das Programm mit "java KlassennameDenIhrGeradeKompiliertHabt.class" aufgerufen, was falsch ist. Man darf hier das "class" nicht an den Befehl anhängen. | ||
+ | |||
+ | [[Kategorie:Java]] |
Aktuelle Version vom 1. August 2010, 11:58 Uhr
Ihr findet hier eine kurze Erklärung mit Lösungsansatz zu den häufigsten Compiler- und Laufzeitfehlern. Versucht diese Fehlermeldungen bitte immer zu lesen, Java gibt euch relativ aufschlussreiche Fehlermeldungen, sodass es durchaus möglich ist, von der Meldung auf den tatsächlichen Fehler zu schließen!
Inhaltsverzeichnis
- 1 CompilerFehler
- 1.1 Exception in thread "main" java.lang.NoClassDefFoundError
- 1.2 Fehlermeldung "unchecked or unsafe operations"
- 1.3 non-static method someMethod() cannot be referenced from a static context
- 1.4 Falsche Parameter
- 1.5 Inkompatible Typen
- 1.6 Klammer fehlt
- 1.7 Semikolon fehlt
- 1.8 Doppelte Deklaration
- 1.9 Definition fehlt
- 1.10 verwirrender Vergleichsfehler
- 1.11 Missing return statement
- 2 Laufzeit-Fehler oder Exceptions (sprich Äkssepschons)
- 2.1 java.lang.NoClassDefFoundError
- 2.2 java.lang.NoSuchMethodError
- 2.3 java.lang.ArrayIndexOutOfBoundsException
- 2.4 java.lang.NullPointerException
- 2.5 java.lang.ArithmeticException
- 2.6 java.lang.StackOverflowError
- 2.7 Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
- 2.8 Exception in thread "main" java.lang.NoClassDefFoundError
CompilerFehler
Exception in thread "main" java.lang.NoClassDefFoundError
Beim Kompilieren (von Datei X.java, welche ein Objekt Y aus der Datei Y.class/Y.java einbinden will:
X.java:5: cannot resolve symbol symbol : class Y location: class X Y y = new Y(); ^
- Mann kann das Problem auf zwei Arten lösen:
- man schreibt "java -cp . Klasse" anstatt nur "java Klasse" um sie Auszuführen
- verwendet man die bash: schreibt man export CLASSPATH=$CLASSPATH:. entweder in jeder shell einmal oder in die .bashrc eintragen und die shell mit exec bash neu starten.
- verwendet man die tcsh: schreibt man setenv CLASSPATH ".:$CLASSPATH" entweder in jeder shell oder einmal in der .cshrc eintragen und die shell mit tcsh neu starten.
- Der Fehler bedeutet, dass die Shell-Variable CLASSPATH gesetzt ist. Das hat zur Folge das Java den Standardwert "." (das Verzeichnis in dem man gerade ist) nicht mehr in den CLASSPATH aufnimmt und diese Fehlermeldung auflöst.
Fehlermeldung "unchecked or unsafe operations"
Note: Test.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
- Dann könnt ihr die entweder ignorieren, oder aber ihr übergebt den zusätzlichen Parameter an den Java-Compiler (javac -Xlint:unchecked foo.java).
Normalerweise sollte man solche Konstrukte natürlich vermeiden, dazu ist ja die Fehlermeldung da, aber für den Kurs ist das erstmal nicht weiter wichtig.
non-static method someMethod() cannot be referenced from a static context
pepino felixf 3 (~/Desktop): javac Test.java Test.java:13: non-static method someMethod() cannot be referenced from a static context someMethod(); ^ 1 error
Diese Fehler tritt auf, wenn eine Objectmethode wie eine statische Methode aufgerufen wird, d.h. die Methode wir nicht auf eine Objekt aufgerufen, sondern wie eine statische Methode ohne Punktoperator. Lösung:
FooBar name = new FooBar(); name.someMethod();
Falsche Parameter
bruja shabanov 23 (Desktop/JavaKurs): javac Errors.java Errors.java:4: setANumber(int) in Errors cannot be applied to (java.lang.String) setANumber("aNumber"); ^ 1 error
- Dieser Fehler tritt auf wenn ihr z.B. bei einem Methodenaufruf Parameter eines falschen Typs übergebt.
- Hier erwartet die Methode setANumber eine Zahl vom Typ int, bekommt aber einen String. Das geht nicht.
Inkompatible Typen
bruja shabanov 18 (Desktop/JavaKurs): javac Errors.java Errors.java:6: incompatible types found : java.lang.String required: double double aDouble = anInt + aString; ^ 1 error
- Dieser Fehler tritt dann auf, wenn bei einer Zuweisung die Datentypen der Variablen nicht übereinstimmen, wie in diesem fehlerhaften Code:
String aString= "47"; int anInt = 11; double aDouble = anInt + aString;
- Es ist zwar möglich, aus einer Zahl einen String zu erzeugen und umgekehrt. Da dies aber relativ kompliziert ist, behandeln wir das im Rahmen dieses Kurses nicht. Versucht einfach, Zahlen mit Zahlen und Strings mit Strings zu verknüpfen, dann wird euch auch der Compiler danken.
Klammer fehlt
bruja shabanov 10 (Desktop/JavaKurs): javac Errors.java Errors.java:7: '}' expected ^ 1 error
- Es fehlt einfach eine geschweifte Klammer.
- Jedes Mal, wenn ihr eine geschweifte Klammer aufmacht, macht sie gleich wieder zu, damit ihr das später nicht vergesst.
- Bei Klammerfehlern solltet ihr nach jedem korrigierten Fehler neu kompilieren, da es normalerweise zu sehr vielen Folgefehlern kommt.
Semikolon fehlt
bruja shabanov 25 (Desktop/JavaKurs): javac Errors.java Errors.java:5: ';' expected } ^ 1 error
- Es fehlt einfach ein Semikolon.
- Sucht vor der angegebenen Zeile nach einer Anweisung, die kein Semikolon am Ende hat.
Doppelte Deklaration
bruja shabanov 11 (Desktop/JavaKurs): javac Errors.java Errors.java:5: i is already defined in main(java.lang.String[]) for( int i = 0 ; i < 10 ; i++ ){ ^ 1 error
- Die Variable i ist irgendwo bereits definiert gewesen. Sucht also vor dieser Zeile nach einem:
int i = ..
- Ihr müsst dann den Variablennamen in der Schleife z.B. ändern.
Definition fehlt
bruja shabanov 5 (Desktop/JavaKurs): javac Errors.java Errors.java:15: variable ret might not have been initialized return ret; ^ 1 error
- Ihr habt eine Variable nicht richtig initialisiert, das passiert oft, wenn ihr einer Variable innerhalb einer if-Anweisung Werte zuweist, wie in diesem Code (der zudem obigen Fehler führt):
public static String someMethod( int x ){ String ret; if( x == 4711 ){ ret = "foobar"; } return ret; }
- Die Variable
ret
bekommt nur dann einen Wert zugeordnet, wenn x == 4711 gilt, da dies nicht immer der Fall sein muss, könnte der Fall auftreten, dassret
gar keinen Wert zugeordnet bekommt. - Fügt einen default-Wert für
ret
hinzu um diesen Fehler zu beheben, z.B. so:
String ret = "";
verwirrender Vergleichsfehler
Hangman.java:36: unexpected type required: variable found : value
if (wort.charAt(i) = buchstabe) {
- Statt einem Vergleich hat man den Wert überspeichert und ein verwirrender Fehler ergötzt sich unser.
Missing return statement
bruja shabanov 6 (Desktop/JavaKurs): javac Errors.java Errors.java:17: missing return statement } ^ 1 error
- Ihr habt in einer Methode, die etwas zurückgeben soll, entweder das return vergessen, oder das return steht nur innerhalb von if-Anweisungen, wie hier:
public static boolean isPositive( int num ){ if( num > 0 ){ return true; }else if( num < 0 ){ return false; } }
- Da alle returns in einem if-Block stehen, könnte es theoretisch sein, dass keiner der Blöcke ausgeführt wird und Java somit nicht weiß, was es zurück geben soll.
- Fügt, um das Problem zu lösen, ein return am Ende eurer Methode ein, oder ändert ein else if in ein else.
public static boolean isPositive( int num ){ if( num > 0 ){ return true; }else if( num < 0 ){ return false; } return false; }
Laufzeit-Fehler oder Exceptions (sprich Äkssepschons)
java.lang.NoClassDefFoundError
bruja shabanov 7 (Desktop/JavaKurs): java Errors Exception in thread "main" java.lang.NoClassDefFoundError: Errors
- Das heißt, Java kann die Klasse nicht finden, die ihr ausführen wollt.
- Schaut genau nach, ob der Dateiname und der Klassennamme gleich sind. Dabei ist auch wichtig, die Groß-/Kleinschreibung zu beachten. Außerdem achtet darauf, ob ihr in die Konsole die richtigen Namen eingetippt habt.
java.lang.NoSuchMethodError
bruja shabanov 9 (Desktop/JavaKurs): java Errors Exception in thread "main" java.lang.NoSuchMethodError: main
- Java findet eine Methode nicht (hier speziell die main Methode).
- Schaut, ob ihr beim Aufruf den Methodennamen richtig geschrieben habt.
java.lang.ArrayIndexOutOfBoundsException
bruja shabanov 8 (Desktop/JavaKurs): java Errors Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Errors.main(Errors.java:5)
- Ihr versucht, auf ein Array Feld zuzugreifen, was außerhalb der Größe des Arrays liegt.
- Sucht in der angegeben Zeile nach dem Zugriff auf das Array und stellt fest, warum der Index zu groß geworden ist.
- "Printline-Debugging" hilft (Index vor jedem Zugriff ausgeben)!
java.lang.NullPointerException
bruja shabanov 13 (Desktop/JavaKurs): java Errors Exception in thread "main" java.lang.NullPointerException at Errors.main(Errors.java:5)
- Ihr versucht, auf eine Variable zuzugreifen oder führt mit ihr Operationen aus, obwohl sie noch nicht initialisiert ist.
- Das passiert oft, wenn man mit z.B. String-Arrays arbeitet. Obwohl man das Array initialisiert hat, sind die Elemente darin noch nicht initialisiert.
String[] stringArray = new String[12];
- Hier kann es helfen, den Array-Elementen entweder direkt Werte zuzuweisen oder mit einer Schleife alle auf einen default-Wert setzen:
for(int i = 0 ; i < stringArray.length ; i++ ){ stringArray[i] = ""; }
java.lang.ArithmeticException
bruja shabanov 15 (Desktop/JavaKurs): java Errors Exception in thread "main" java.lang.ArithmeticException: / by zero at Errors.main(Errors.java:4)
- Dieser Fehler tritt auf, wenn ihr versucht, ungültige arithmetische Operationen auszuführen, wie hier die Division durch 0.
- Ihr könnt euch Gedanken über das axiomatische Gerüst der Mathematik machen und nach einem Weg suchen, durch 0 zu teilen, einfacher ist es jedoch, wenn ihr nicht durch 0 teilt, keine Wurzeln aus negativen Zahlen zieht usw.
java.lang.StackOverflowError
Exception in thread "main" java.lang.StackOverflowError
Diese Fehler tritt auf, wenn ihr eine Endlosrekursion produziert habt. Im Zweifelsfall seht ihr diese Fehlermeldung aber nicht, da nach dieser der Bildschirm endlos mit der Zeilenangabe vollgeschrieben wird.
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
pepino felixf 17 (~/Desktop): java Test Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
Ihr solltet etwas sorgsamer mit eurem Speicherplatz (RAM) umgehen ;-)
Exception in thread "main" java.lang.NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError:KlassennameDenIhrGeradeKompiliertHabt
Die Lösung dieses Fehlers verhält sich äquivalent wie der NoClassDefFoundError zur Compile-Zeit, welche weiter oben beschrieben wird.
Sollte der CLASSPATH korrekt gesetzt sein und sich eure Java-Dateien alle am richtigen Ort befinden, so könnte es trotzdem sein, dass eine Klasse nicht gefunden wird:
Exception in thread "main" java.lang.NoClassDefFoundError:KlassennameDenIhrGeradeKompiliertHabt/class
- dann habt ihr das Programm mit "java KlassennameDenIhrGeradeKompiliertHabt.class" aufgerufen, was falsch ist. Man darf hier das "class" nicht an den Befehl anhängen.