Learning By Doing Exceptions (Ausnahmebehandlung) • Typische Fehlverhalten zur Laufzeit: - Verwendung von null-Objekten - Illegale mathematische Operationen - Aufruf einer Methode mit Parametern ausserhalb des erlaubten Bereichs (Nichteinhaltung der Preconditions) Turtle t; t.forward(100); int a = 2; int b = 0; int c = a / b; - Eingabewerte ausserhalb des erlaubten Bereichs (Inputvalidation) - Überlauf von reservierten Speicherbereichen (Arrayindex, Stringlängen, Memorypools) • Typische Reaktionen: - Programm od. Computer hängt ohne Fehlermeldung (Absturz) - Fehlermeldung und Möglichkeit, das Programm höflich zu beenden • Hauptproblem: - Schwierig voraussehbar, was alles schief gehen kann (defensive Programmierung) - Fehler kann in einem gewissen Bereich des Programms auftreten. Nach Fehler muss man aus diesem Bereich hinausspringen und den Fehler in einem Fehlerhandler bearbeiten (unstrukturierte Programmierung, goto) s. Buch S. 287ff Learning By Doing try-catch-Blöcke try { ... BbbException geworfen } catch (AaaException ex) { } catch (BbbException ex) { } finally { } ... Learning By Doing // WbzEx16.java import ch.aplu.util.*; Ohne Fehlerabfang public class WbzEx16 { private int[] a = new int[2]; public WbzEx16() { System.out.println( "Array mit zwei Elementen.\n" + "Weise dem zweiten einen Wert zu..."); a[2] = 6; System.out.println("hier geht's weiter"); } public static void main(String[] args) { Console.init(); new WbzEx16(); } } Nichts geht weiter Learning By Doing // WbzEx16a.java import ch.aplu.util.*; Mit Fehlerabfang public class WbzEx16a { private int[] a = new int[2]; public WbzEx16a() { System.out.println( "Array mit zwei Elementen.\n" + "Weise dem zweiten einen Wert zu..."); try { a[2] = 6; } catch (Exception ex) { System.out.println("Exception gefangen"); System.out.println(ex); } System.out.println("Hier geht's weiter..."); } public static void main(String[] args) { Console.init(); new WbzEx16a(); } } Schon besser Learning By Doing Klassenhierarchie der Exceptions Throwable Error ... Exception RuntimeException IOException ... Wirft eine Methode eine Exception, so gilt: • Explizite Exceptions müssen abgefangen werden (grau) Beispiel: FileNotFoundException (Subklasse von IOException) • Implizite Exceptions können abgefangen werden Beispiel: ArrayIndexOutOfBoundsException (Subklasse von RuntimeException) Learning By Doing Exceptions "nach oben werfen" // WbzEx17.java import ch.aplu.util.*; public class WbzEx17 { public WbzEx17() throws Exception { System.out.println("Gehe schlafen, szssss..."); Thread.currentThread().sleep(3000); System.out.println("bin wieder aufgewacht."); } Kein guter Programmierstil } public static void main(String[] args) throws Exception { Console.init(); Aber voller new WbzEx17(); try-catch-Blöcke } auch nicht!