Ausnahmenbehandlung in Java Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien Was sind Exceptions? n n n Eine Ausnahme (Exception) ist ein Objekt einer Unterklasse von Throwable Eine Ausnahme tritt dann auf, wenn bei der Programmausführung eine semantische Regel verletzt wird. (z.B. x[-4], Division durch 0) In manchen Fällen kann man Exceptions durch if ... else abfangen, allerdings ergibt sich daraus ein hoher Programmieraufwand Exception Handling n n n Zur Laufzeit wird eine Ausnahme erzeugt die in einem Ausnahmebehandler (Exception Handler) aufgefangen und bearbeitet wird Ein Block um alle "kritischen Stellen" reicht Nach einem Sprung in den Ausnahmebehandler wird nicht mehr zurückgesprungen Beispiel 1 public class Exception1 { public static void main (String args[]) { int[] feld = new int[100]; for (int i=0; i<=99; i++) { feld[i] = i; } Zuweisung for (int i = 0; i <= 99; i++) { System.out.println("i = " + feld[i]); } } } Ausgabe Beispiel 1 public class Exception2 { public static void main (String args[]) { int[] feld = new int[100]; for (int i=0; i<=99; i++) { feld[i] = i; } Fehler for (int i = 0; i <= 100; i++) { System.out.println("i = " + feld[i]); } } } Der Interpreter (nicht der Compiler!) bricht die Ausführung ab Beispiel 1 public class Exception3 { public static void main (String args[]) { int[] feld = new int[100]; try { for (int i=0; i<=99; i++) { feld[i] = i; } try-Block for (int i = 0; i <= 100; i++) { System.out.println("i = " + feld[i]); } catch-Block } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Fehler!"); } System.out.println("Hier geht es ganz normal weiter"); } } Das Programm wird ausgeführt! ExceptionBeispiel1 Angabe Aufgabe: Schreiben Sie ein Programm "ExceptionBeispiel1" das in einer for-Schleife mit einer int-Zählvariablen von 10 bis –10 rückwärts zählt. In der Schleife wird die Zahl 100 durch den Zählwert dividiert und ausgegeben. Um die Division durch Null abzufangen verwenden Sie die Ausnahme "ArithmeticException". ExceptionBeispiel1 Lösung public class ExceptionBeispiel1 { public static void main (String args[]) { try { for (int i = 10; i >= -10; i--) { System.out.println(100/i); } } catch (ArithmeticException e) { System.out.println("Das geht nicht"); } } } Eigene Exceptions (1) public class MyException extends java.lang.Throwable { } Die Superklasse der Klassen Error und Exception Mit diesem Schritt erzeuge ich eine eigene Fehlerklasse MyException Eigene Exceptions (2) public class ExceptionTest { public static void main(String args[]) { System.out.print("So "); try { System.out.print("ist "); throw new MyException(); } catch (MyException m) { Abfangen der Exception System.out.print("der "); } System.out.print("Ablauf "); } } Aufwurf der Exception und Suche nach Ausnahmenbehandler ExceptionBeispiel2 Angabe Aufgabe: Schreiben Sie eine Exception-Klasse MeineAusnahme die eine Methode ausgabe() besitzt, welche "Das ist leider nicht moeglich" ausgibt. In einer Klasse ExceptionBeispiel2 verwenden sie eine forSchleife die von 1 bis 100 zählt und den jeweiligen Wert ausgibt. Sobald der Zähler auf 50 kommt soll ihre "Exception" ausgeworfen werden. ExceptionBeispiel2 Lösung (1) public class MeineAusnahme extends java.lang.Throwable { public void ausgabe() { System.out.println("Das ist leider nicht moeglich"); } } ExceptionBeispiel2 Lösung (2) public class ExceptionBeispiel2 { public static void main(String args[]) { try { for (int i = 1; i <= 100; i++) { if (i==50) throw new MeineAusnahme(); } } catch (MeineAusnahme m) { m.ausgabe(); } } } Behandeln von Exceptions Exceptions müssen mit try...catch entweder selbst behandelt werden oder mit throws an die aufrufende Methode weitergeleitet werden. Beispiel (siehe auch folgende Folie): public class MyNewException extends java.lang.Throwable { } Behandeln von Exceptions public class ExceptionHierarchy { public static void main(String args[]) { method1(); } static void method1() { try { method2(); } Die Methode welche die Exception aufwirft (throw) muss sie entweder selbst behandeln (try...catch) oder weiterleiten (throws) } catch (MyNewException m) { System.out.println("Die Methode1 hat einen Fehler aufgefangen"); } } static void method2() throws MyNewException{ System.out.println("Hier spricht die Methode2"); method3(); } static void method3() throws MyNewException { System.out.println("Hier spricht die Methode3"); if (1 == 1) throw new MyNewException(); } Weiterleitung der Exception an die aufrufende Methode Übungen 1) Löschen Sie im vorherigen Beispiel (ExceptionHierarchy) bei der Methode 3 die Klausel throws MyNewException. Was passiert? Machen Sie die Änderung wieder rückgängig. 2) Löschen Sie im bei der Methode 2 die Klausel throws MyNewException. Was passiert? Machen Sie die Änderung wieder rückgängig. 3) Entfernen Sie die Ausnahmenbehandlung in der Methode 1 und versuchen Sie diese ebenfalls weiterzuleiten. Was passiert? Machen Sie die Änderung wieder rückgängig. 4) Implemetieren Sie die Ausnahmenbehandlung direkt in der Methode 3 finally und System.err public class ExceptionBeispiel4 { public static void main(String args[]) { method1(); } static void method1() { int a = 6; int b = 2; int c; try { c = a/b; System.out.println(c); Standard error stream } catch (ArithmeticException ex) { System.err.println("Divsion durch Null"); Dieser Block wird auf jeden Fall ausgeführt } } } finally { System.err.println("Diese Meldung kommt auf jeden Fall"); } ExceptionBeispiel5 Angabe Schreiben Sie ein Programm ExceptionBeispiel5 welches die Zahl 10 durch Zufallswerte (int) zwischen –5 und +5 dividiert. Geben Sie die Ergebnisse aus (int). Falls eine Division durch 0 vorkommt fangen Sie diese auf und geben Sie "Division durch Null!" aus. Zusätzlich soll auf jeden Fall "Ende der Ausgabe" erscheinen. Für die Ausgaben im Fehlerfall benützen Sie den Ausgabestream System.err. ExceptionBeispiel5 Lösung public class ExceptionBeispiel5 { public static void main(String args[]) { int dividend = 10; int divisor; try { for (int i = 0; i<10; i++) { divisor = (int)(Math.random()*11)-5; System.out.println(dividend/divisor); } } catch (ArithmeticException ex) { System.err.println("Division durch Null!"); } finally { System.err.println("Ende der Ausgabe"); } } } Die Klasse Exception public class ExceptionBeispiel6 { public static void main(String args[]) { try { int a = 7/0; } catch (Exception e) { System.err.println("Fehler"); System.err.println("***"); System.err.println(e.getMessage()); System.err.println("***"); System.err.println(e.toString()); System.err.println("***"); Methoden der Klasse Throwable (Superklasse von Exception) e.printStackTrace(); System.err.println("***"); System.err.println(e.getClass().getName()); } } } Methode der Klasse Object Methode der Klasse Class