Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Errors: Unterschied zwischen den Versionen

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!
+
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'''=
Zeile 28: Zeile 28:
 
  int anInt = 11;
 
  int anInt = 11;
 
  double aDouble = anInt + aString;
 
  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.
+
*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.
  
  
Zeile 39: Zeile 39:
 
  1 error
 
  1 error
 
* Es fehlt einfach eine geschweifte Klammer.
 
* 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.
+
* 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.
 
* Bei Klammerfehlern solltet ihr nach jedem korrigierten Fehler neu kompilieren, da es normalerweise zu sehr vielen Folgefehlern kommt.
  
Zeile 71: Zeile 71:
 
                         ^
 
                         ^
 
  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 79: Zeile 79:
 
  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 = "";
  
Zeile 99: Zeile 99:
 
  }
 
  }
 
  }
 
  }
* 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 weiss was es zurück geben soll.
+
* 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.
+
* 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 110: Zeile 110:
 
  }
 
  }
  
='''LaufzeitFehler oder Exceptions (sprich Äkssepschons)'''=  
+
='''Laufzeit-Fehler oder Exceptions (sprich Äkssepschons)'''=  
  
  
Zeile 117: Zeile 117:
 
  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
* Heisst Java kann die Klasse nicht finden, die ihr ausführen wollt.
+
* 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ß/Klein Schreibung zu beachten. Ausserdem achtet darauf ob ihr in die Konsole die richtigen Namen eingetippt habt.
+
* 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 124: Zeile 124:
 
  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 132: Zeile 132:
 
  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 ausserhalb der Größe des Arrays liegt.  
+
*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 gross geworden ist.
+
*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)!
 
*"Printline-Debugging" hilft (Index vor jedem Zugriff ausgeben)!
  
Zeile 141: Zeile 141:
 
  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 hat 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:
Zeile 153: Zeile 153:
 
  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 einfach nicht durch 0 teilt, keine Wurzeln aus negativen Zahlen zieht usw.
+
*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.

Version vom 12. April 2007, 13:28 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!

CompilerFehler

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, dass ret gar keinen Wert zugeordnet bekommt.
  • Fügt einen default-Wert für ret hinzu um diesen Fehler zu beheben, z.B. so:
 		String ret = "";


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.