Vorlesung 10. Sitzung Grundlegende Programmiertechniken Wintersemester 2007/2008 Dozent Nino Simunic M.A. Computerlinguistik, Campus DU Grundlegende Programmiertechniken, WS 2007/2008 Objektorientierte Ausnahmebehandlung (in Java) Ausnahmen? Ausnahmen (engl. Exceptions) sind Fehlersituationen während der Programmausführung Java unterstützt explizite, objektorientierte Ausnahmebehandlung: JVM erkennt Ausnahmen und erzeugt entsprechende Ausnahme-Objekt. Beispiele: Division durch 0 ArithmeticException Ungültiger Array-Zugriff (z.B. arr[arr.length]) ArrayIndexOutOfBoundsException Zugriff aus eine nicht vorhandene Datei FileNotFoundException -3- Ausschnitt der Ausnahme-Klassen-Hierarchie java.lang.Object java.lang.Throwable java.lang.Error Error: Fehler innerhalb des Laufzeitsystems. Können i.d.R. nicht von behandelt werden. Beispiele: VirtualMachineErro r, ThreadDeath,… -4- java.lang.Exception Exception:»Reguläre«Fehler »Reguläre«Fehlereines eines Exception: Programm. Teilung Teilungin inkontrollierte kontrollierteund und Programm. unkontrollierteAusnahmen: Ausnahmen: unkontrollierte KontrollierteAusnahmen: Ausnahmen: Müssen Müssenvom vom Kontrollierte Programm behandelt behandeltwerden. werden. Programm UnkontrollierteAusnahmen: Ausnahmen: Können Können Unkontrollierte vom Programm Programm behandelt behandelt werden. werden. vom UnkontrollierteAusnahmen Ausnahmensind sind Unkontrollierte Subklassenvon vonRuntimeException RuntimeException Subklassen Bsp. für kontrollierte Ausnahmen: FileNotFoundException java.lang.Object java.lang.Throwable java.lang.Exception java.io.IOException java.io.FileNotFoundException FileNotFoundException FileNotFoundException Kontrollierte(engl. (engl. checked) checked) Ausnahme Ausnahme––muss muss Kontrollierte behandeltwerden! werden! behandelt -5- Bsp. für unkontrollierte Ausnahmen: ArrayIndexOutOfBoundsException java.lang.Object java.lang.Throwable java.lang.Exception java.io.RuntimeException java.io.IndexOutOfBoundsException java.io.ArrayIndexOutOfBoundsException -6- ArrayIndexOutOfBoundsException ArrayIndexOutOfBoundsException Unkontrollierte(engl. (engl. unchecked) unchecked) Ausnahme Ausnahme––kann kann Unkontrollierte behandeltwerden! werden! behandelt Beispiel für eine Runtime Exception (hier arithmetischer Fehler) public class Divider { public static void main(String args[]) { int a = 10, b = 0, result; result = a / b; System.out.println(result); } } ArithmeticException: ArithmeticException: Unterklasse Unterklasse von von RuntimeException RuntimeException Daher: Daher: unkontrollierte unkontrollierte Ausnahme. Ausnahme. Kann, Kann, muss muss aber aber nicht nicht behandelt behandelt werden werden -7- Javas Ausnahmemechanismus (1) Eine Methode einer Klasse erkennt eine Ausnahmesituation, erzeugt ein Objekt einer Ausnahmeklasse (Objekt enthält Information über den Ausnahme-Typ, Zustand des Programms, …) -8- und löst damit eine Ausnahme aus. Generell: Ausnahmen sind Ereignisse, welche als Datenstruktur (Exception-Objekte) repräsentiert werden. Informationen eines Ausnahme-Objekts public class ArrayIndex { public static void main(String[] args) { int[] intArr = new int[2]; intArr[0] = 1; intArr[intArr.length] = 2; } } Typ Typder der Ausnahme Ausnahme Stack-Trace Stack-Trace Umgekehrte Umgekehrte Auflistung Auflistung unbeendeter unbeendeter Methodenaufrufe Methodenaufrufe bis bis zur zur Ausnahme. Ausnahme. -9- Details Details Dokumentation der möglichen Fehlersituationen -1010- Standard-Klassen der Java-API dokumentieren mögliche Exceptions Javas Ausnahmemechanismus (2) Die Ausnahme kann Die Methode, an die die Ausnahme weitergereicht wurde, kann diese Ausnahme abfangen und/oder behandeln oder wiederum weiterzureichen. Wird die Ausnahme immer nur weitergereicht und in keiner Methode behandelt, bricht das Programm mit einer Fehlermeldung ab -1111- entweder in derselben Methode abgefangen werden, oder an die aufrufende Methode weitergegeben werden. Letzte Möglichkeit zur Behandlung: main() Details der Klasse Throwable Konstruktoren von Throwable Throwable( ) Throwable( String message ) Methoden von Throwable String getMessage( ) gibt den String aus, der beim Konstruktor übergeben wurde void printStackTrace( ) Infos zum Laufzeitverhalten beim Auftreten der Ausnahme -1212- … Klasse Exception: Details Konstruktoren der Klasse Exception -1313- Exception() Exception( String message ) Wird ein Konstruktor aufgerufen, wird ein Objekt dieser Ausnahmeklasse erstellt, d.h. eine Ausnahme ausgelöst. Implementierung eigener Exceptions: Subklassenbildung von Exception Eigene Exception: Ableitung der Klasse Exception public class IDException extends Exception { public IDException() { } public IDException(int id) { super("Illegal id: " + id); } } -1414- Erbt getMessage(), printStackTrace(), … Ausnahmebehandlung Und wie behandelt man die Fehler? JVM Standardausnahmebehandlung Stack-Trace Ausgabe, Abbruch des Programms Explizit: try-catch(-finally) Anweisung Benutzerdefiniertes Verhalten bei Ausnahmen -1515- try{{}:}: try try-catch-finally Trittim imtry-Block try-Blockeine eine Tritt Ausnahmevom vom Typ Typdes des Ausnahme Parametersauf: auf:Ausführung Ausführungdes des Parameters catch-Blocks. catch-Blocks. try { Anweisungenim im try-Block, try-Block, die die Anweisungen // Block, in dem der riskante Code hinter der derAnweisung Anweisung liegen, liegen, die die hinter // steht bzw. in dem abzufangende dieAusnahme Ausnahmeverursacht verursacht hat, hat, die // Ausnahmen auftreten können werdennicht nicht mehr mehrausgeführt ausgeführt werden } catch (Exception e) { // Block, in dem steht, was bei Auftreten // einer Ausnahme geschehen soll. // Mehrere sukzessive catch-Blöcke möglich } finally { // wird in jedem Fall ausgeführt } -1616- try-catch-finally catch(Parameter){ ...} Block mit Anweisungen, die festlegen, was bei Auftreten einer Ausnahme geschehen soll. try { Parameter-Typ: (Subklasse von) // Block, in dem der riskante Code Throwable // steht bzw. in dem abzufangende Mehrere catch-Blöcke mit // Ausnahmen auftreten können unterschiedlichen Exception-Typen } catch (Exception e) { möglich // Block, in dem steht, was bei Auftreten Differenzierung von unterschiedlichen // einer Ausnahme geschehen soll. Fehlern. // Mehrere sukzessive catch-Blöcke möglich Bei mehreren catch-Blöcken: Werden in der Reihenfolge ihres } finally { Auftretens berücksichtigt. // wird in jedem Fall ausgeführt } Wurde ein catch-Block ausgeführt, werden die danach stehenden Blöcke nicht mehr ausgeführt. -1717- Beispielimplementierung mit try-catch Behandlung public class HandledDivider { public static void main(String args[]) { int a = 10, b = 0, result=0; try { result = a / b; } catch ( ArithmeticException e1 ){ System.out.print("Exception detected. Reason: "+ e1.getMessage()); return; } System.out.println(result); System.out.println("Good bye!"); } } Exception Exception detected. detected. Reason: Reason: // by by zero zero -1818- (try-catch-) finally finally {...} : Block mit Anweisungen, der in jedem Fall ausgeführt wird: -1919- Wenn der try-Block ohne Auftreten einer Ausnahme durchlaufen wird Wenn eine Ausnahme in einem der catch-Blöcke behandelt wurde Wenn eine Ausnahme in keinem der catch-Blöcke behandelt wurde Wenn der try-Block durch (break oder) return verlassen wurde finally-Beispiel (und Differenzierung von Fehlern) public class HandledArrayIndex { public static void main(String[] args) { int[] intArr = new int[2]; double r=0; try { intArr[0] = 4; intArr[1] = 0; intArr[2] = 0; //r = intArr[0] / intArr[1]; } catch (ArrayIndexOutOfBoundsException e1) { System.out.println("Exception detected.Illegal index:"+ e1.getMessage()); return; } catch (ArithmeticException e2) { System.out.println("Exception detected.Illegal division:" + e2.getMessage()); return; } finally { System.out.println(r); } System.out.println("End of program!"); } Exception detected.Illegal index:2 } 0.0 Exception detected.Illegal division:/ by zero -20200.0 Gruppierung/Verallgemeinerung von Fehlern public class HandledArrayIndex2 { public static void main(String[] args) { int[] intArr = new int[2]; double r=0; try { intArr[0] = 4; intArr[1] = 0; //intArr[2] = 0; r = intArr[0] / intArr[1]; } catch (Exception e) { System.out.println("Exception detected: "+ e.getMessage()); return; } finally { System.out.println(r); } System.out.println("Bye"); } } Exception detected: / by zero -21210.0 Abfangen, Signalisieren, Weitergeben von Ausnahmen Kontrollierte Ausnahmen müssen -2222- entweder abgefangen werden (try-catch) oder an den Aufrufer weitergegeben werden (throw, throws) Der Compiler achtet auf die Einhaltung dieser Regel! throws throws Exception-Liste Wird die Ausnahme nicht in der sie auslösenden Methode behandelt, muss sie weitergereicht werden throws-Klausel in der Methodendeklaration Exception-Liste Eine oder mehrere (durch Komma getrennte) Ausnahmen. Beispiel: public void myMethod () throws ArrayIndexOutOfBoundsException, FileNotFoundException { … } -2323- Beispiel/Illustration: Weiterreichen von Exceptions Kein throws, da try-catch Behandlung void methode1() { try { methode2(); } catch (ArithmeticException ae) { // Fehlerbehandlung } } START: methode1 wird aufgerufen Programmfluss void methode2() throws ArithmeticException{ methode3(); } void methode3() throws ArithmeticException{ rechnen(); } void rechnen() throws ArithmeticException{ System.out.println(1/0); } Ausnahme tritt auf in rechnen()-Methode. Keine Behandlung: Compiler verpflichtet zu throws. Exception wird »nach oben« weitergeworfen/-gereicht. -2424- Programmfluss Weiterreichen/Behandlung der Exception throw throw Ausnahmeobjekt throw unterbricht das Programm an der implementierten Stelle, um … (1) die Ausnahme zu behandeln (2) oder die Weitergabe auszuführen. -2525- Weitergabe muss im Methodenkopf angegeben werden: throws Exception-Liste throw-Beispiel (1: Weiterreichen der Exception) public class Person { private int persNummer; public Person(int persNummer) throws IDException { if (persNummer < 1 || persNummer > 100) { throw new IDException(persNummer); } this.persNummer = persNummer; } } -2626- public static void main(String[] args) { try { Person p = new Person(-12); } catch ( IDException e ) { e.printStackTrace(); System.exit(-1); } } IDException: IDException: Illegal Illegal id: id: -12 -12 at at Person.<init>(Person.java:6) Person.<init>(Person.java:6) at at Person.main(Person.java:13) Person.main(Person.java:13) throw-Beispiel (2: Behandeln der Exception) public class Person2 { private int persNummer; public Person2(int persNummer) { if (persNummer < 1 || persNummer > 100) { try { throw new IDException(persNummer); } catch (IDException e) { e.printStackTrace(); } } this.persNummer = persNummer; } public static void main(String[] args) { Person p = new Person(-12); } } -2727- Teil-Behandlung von Exceptions (try-catch und throws) public class HandledArrayIndex { public static void main(String[] args) throws ArithmeticException { int[] intArr = new int[2]; double r=0; try { intArr[0] = 4; intArr[1] = 0; //intArr[2] = 0; r = intArr[0] / intArr[1]; } catch (ArrayIndexOutOfBoundsException e1) { System.out.println("Exception detected:"+ e1.getMessage()); return; } finally { System.out.println(r); } System.out.println("Bye"); } } -2828- Stack-Trace public class Test { void methode1() { methode2(); } void methode2() throws ArithmeticException{ methode3(); } void methode3() throws ArithmeticException{ rechnen(); } void rechnen() throws ArithmeticException{System.out.println(1/0); } } public static void main(String[] args) { Test t = new Test(); t.methode1(); } Exception Exception in in thread thread "main" "main" java.lang.ArithmeticException: java.lang.ArithmeticException: // by by zero zero at at Test.rechnen(Test.java:13) Test.rechnen(Test.java:13) at at Test.methode3(Test.java:10) Test.methode3(Test.java:10) at at Test.methode2(Test.java:8) Test.methode2(Test.java:8) at at Test.methode1(Test.java:4) Test.methode1(Test.java:4) at at Test.main(Test.java:19) Test.main(Test.java:19) -2929- Diverses Morgen ab 17.00 Uhr auf »unserer« Seite: Hausaufgabe Themen der Klausur: -3030- Multiple Choice Implementierungsbeschreibungen, Erklärungen zu OOP Kleinere Implementierungen Mini-Programm Hinweis: Es reicht nicht, sich nur die Folien durchzulesen. Alle bisherigen Themen, inklusive Ausnahmebehandlung Struktur/Allg. Inhalte der Klausur: http://www.uni-due.de/computerlinguistik/prog0708.shtml Verwenden Sie unterstützend eines der vorgeschlagenen Bücher und lesen Sie das/die Kapitel zum jeweiligen Konzept einer Folie. Lösen und verstehen Sie die Übungsaufgaben. Bringen Sie Ihren Studenten- und Personalausweis mit! Donnerstagsübung nächste Woche: Nach Möglichkeit vorherige Übungen besuchen.