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. ArrayIndexOutOfBoundsException Zugriff aus eine nicht vorhandene Datei FileNotFoundException arr[arr.length]) -3-
Ausschnitt der Ausnahme-Klassen-Hierarchie java.lang.object java.lang.throwable java.lang.error java.lang.exception -4- Error: Fehler innerhalb des Laufzeitsystems. Können i.d.r. nicht von behandelt werden. Beispiele: VirtualMachineErro r, ThreadDeath, Exception:»Reguläre«Fehler eines Programm. Teilung in in kontrollierte und unkontrollierte Ausnahmen: Kontrollierte Ausnahmen: Müssen vom Programm behandelt werden. Unkontrollierte Ausnahmen: Können vom Programm behandelt werden. Unkontrollierte Ausnahmen sind Subklassen von RuntimeException
Bsp. für kontrollierte Ausnahmen: FileNotFoundException java.lang.object java.lang.throwable java.lang.exception java.io.ioexception java.io.filenotfoundexception FileNotFoundException Kontrollierte (engl. checked) Ausnahme muss behandelt werden! -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 Unkontrollierte (engl. unchecked) Ausnahme kann behandelt werden!
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: Unterklasse vonruntimeexception Daher: unkontrollierte Ausnahme. Kann, muss aber nicht behandelt 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, ) und löst damit eine Ausnahme aus. Generell: Ausnahmen sind Ereignisse, welche als Datenstruktur (Exception-Objekte) repräsentiert werden. -8-
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 der Ausnahme Typ der Ausnahme Stack-Trace Umgekehrte Auflistung unbeendeter Methodenaufrufe bis zur Ausnahme. Details -9-
Dokumentation der möglichen Fehlersituationen Standard-Klassen der Java-API dokumentieren mögliche Exceptions -10 10-
Javas Ausnahmemechanismus (2) Die Ausnahme kann entweder in derselben Methode abgefangen werden, oder an die aufrufende Methode weitergegeben werden. 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 Letzte Möglichkeit zur Behandlung: main() -11 11-
Details der Klasse Throwable Konstruktoren von Throwable Throwable( ) Throwable( String message ) Methoden von Throwable StringgetMessage( ) gibt den String aus, der beim Konstruktor übergeben wurde void printstacktrace( ) Infos zum Laufzeitverhalten beim Auftreten der Ausnahme -12 12-
Klasse Exception: Details Konstruktoren der Klasse Exception 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 -13 13-
Eigene Exception: Ableitung der Klasse Exception public class IDException extends Exception { public IDException() { public IDException(int id) { super("illegal id: " + id); Erbt getmessage(), printstacktrace(), -14 14-
Ausnahmebehandlung Und wie behandelt man die Fehler? JVM Standardausnahmebehandlung Stack-Trace Ausgabe, Abbruch des Programms Explizit: try-catch(-finally) Anweisung Benutzerdefiniertes Verhalten bei Ausnahmen -15 15-
try-catch-finally try { // Block, in dem der riskante Code // steht bzw. in dem abzufangende // Ausnahmen auftreten können catch (Exception e) { // Block, in dem steht, was bei Auftreten // einer Ausnahme geschehen soll. // Mehrere sukzessive catch-blöcke möglich try try {{: : Tritt im im try-block eine Ausnahme vom Typ des Parameters auf: Ausführung des catch-blocks. Anweisungen im im try-block, die hinter der Anweisung liegen, die die Ausnahme verursacht hat, werden nicht mehr ausgeführt finally { // wird in jedem Fall ausgeführt -16 16-
try-catch-finally try { catch (Exception e) { finally { -17 17- // Block, in dem der riskante Code // steht bzw. in dem abzufangende // Ausnahmen auftreten können // Block, in dem steht, was bei Auftreten // einer Ausnahme geschehen soll. // Mehrere sukzessive catch-blöcke möglich // wird in jedem Fall ausgeführt catch(parameter){... Block mit Anweisungen, die festlegen, was bei Auftreten einer Ausnahme geschehen soll. Parameter-Typ: (Subklasse von) Throwable Mehrere catch-blöcke mit unterschiedlichen Exception-Typen möglich Differenzierung von unterschiedlichen Fehlern. Bei mehreren catch-blöcken: Werden in der Reihenfolge ihres Auftretens berücksichtigt. Wurde ein catch-block ausgeführt, werden die danach stehenden Blöcke nicht mehr ausgeführt.
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 detected. Reason: / by zero Exception detected. Reason: / by zero -18 18-
(try-catch-) finally finally {... : Block mit Anweisungen, der in jedem Fall ausgeführt wird: 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 -19 19-
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!"); -20 20- Exception detected.illegal index:2 0.0 Exception detected.illegal division:/ by zero 0.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 -21 21-0.0
Abfangen, Signalisieren, Weitergeben von Ausnahmen Kontrollierte Ausnahmen müssen entweder abgefangen werden (try-catch) oder an den Aufrufer weitergegeben werden (throw, throws) Der Compiler achtet auf die Einhaltung dieser Regel! -22 22-
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 { -23 23-
Beispiel/Illustration: Weiterreichen von Exceptions void methode1() { try { methode2(); catch (ArithmeticException ae) { // Fehlerbehandlung Kein throws, da try-catch Behandlung Programmfluss void methode2() throws ArithmeticException{ methode3(); START: methode1 wird aufgerufen void methode3() throws ArithmeticException{ rechnen(); -24 24- void rechnen() throws ArithmeticException{ System.out.println(1/0); Programmfluss Ausnahme tritt auf in rechnen()-methode. Keine Behandlung: Compiler verpflichtet zu throws. Exception wird»nach oben«weitergeworfen/-gereicht. 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. Weitergabe muss im Methodenkopf angegeben werden: throwsexception-liste -25 25-
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; public static void main(string[] args) { try { Person p = new Person(-12); catch ( IDException e ) { e.printstacktrace(); System.exit(-1); IDException: Illegal id: id: -12-12 at at Person.<init>(Person.java:6) at at Person.main(Person.java:13) -26 26-
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); -27 27-
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"); -28 28-
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); -29 29- public static void main(string[] args) { Test t = new Test(); t.methode1(); Exception in in thread "main" java.lang.arithmeticexception: / by by zero zero at at Test.rechnen(Test.java:13) at at Test.methode3(Test.java:10) at at Test.methode2(Test.java:8) at at Test.methode1(Test.java:4) at at Test.main(Test.java:19)
Diverses Morgen ab 17.00 Uhr auf»unserer«seite: Hausaufgabe http://www.uni-due.de/computerlinguistik/prog0708.shtml Themen der Klausur: Alle bisherigen Themen, inklusive Ausnahmebehandlung Struktur/Allg. Inhalte der Klausur: Multiple Choice Implementierungsbeschreibungen, Erklärungen zu OOP Kleinere Implementierungen Mini-Programm Hinweis: Es reicht nicht, sich nur die Folien durchzulesen. 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. -30 30-