Java-AG Ausnahmebehandlung Gerhard Gröger
Problem Behandlung von Laufzeitfehlern in Programmen, z.B. Division durch 0 Überschreitung von Arraygrenzen beim Öffnen von Dateien: Datei nicht vorhanden keine Berechtigung
Lösung Ausnahmebehandlungs-Mechanismus Vorteile: Programm stürzt nicht ab Genau definierter Wiedereinsetzpunkt Gezielte Reaktion auf Fehler Saubere Trennung zwischen 'Normalfällen' und Fehlerbehandlung
Beispiel: Division durch 0 try { int a,b; b = 0; a = 7/b; } catch(Exception e) { a = 0; } Ausnahme wird "zurückgeworfen" (thrown) Ausnahme wird nicht abgefangen Fehlermeldung wird ausgegeben Programm stürzt ab!
Beispiel: Division durch 0 try { int a,b; b = 0; a = 7/b; } catch(Exception e) { a = 0; } fehlerträchtiger Code Ausnahme wird zurückgeworfen Reaktion auf Fehler Ausnahme wird abgefangen hier geht es normal weiter
Hierarchie der Exceptions (Auszug) Throwable ErrorException IOExc. FileNotFoundExc. PrinterExc. PrinterAbortExc. ArithmeticExc. RuntimeExc. NullPointerExc.
Wer verursacht Exceptions? Operatoren, z.B. / Explizit durch throw... Methoden (Schlüsselwort throws) Bsp: public FileInputStream(File file) throws FileNotFoundException jeder Ursache ist eindeutig eine Exception-Klasse zugeordnet Unterscheidung Unchecked Exceptions müssen nicht abgefangen werden Checked Exceptions müssen abgefangen werden (sonst nicht übersetzbar)
Schlüsselwort throw Explizites zurückwerfen: z.B. throw new Exception(); Weiterleiten an äußeres try-catch (verschachteltes try-catch) try {... } catch (Exception e) { //Teilweise Behandlung der Exception.... throw e; //Weiterleiten }
Mehrere Catch-Klauseln try { } catch(IOException e1) {//Reaktion auf IO-Exc.} catch(ArithmeticException e2) {//Reaktion auf Arithm. Exc.} catch(NullPointerExceptione3) {//Reaktion auf Null-Pointer-Exc....} catch(Exception e) {//Reaktion sonst}
Finally try { } catch(IOException e1) {//Reaktion auf IO-Exc.} finally {//Wird in jedem Fall ausgeführt}
Aufgabe Schreiben Sie ein Programm, das folgende Fehler erzeugt und abfängt (mit entsprechender Reaktion): Überschreitung von Arraygrenzen ( ArrayIndexOutOfBoundsException ) Division durch 0 ( ArithmeticException ) Benutzen Sie " try " nur einmal! Syntax: try{...} catch(Exception_1 e_1) {...}......catch(Exception_n e_n) {...}
Javadoc: c:/Programme/jdk1.3/docs/api/index.html