Lektion 6: Ausnahmebehandlung Helmar Burkhart Informatik Universität Basel [email protected] Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-0 Übersicht Lektion 6 • Fehler und Ausnahmen • Behandlungsstrategien • Java Sprachkonstrukte • Häufige Ausnahmen • Eigene Ausnahmen Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-1 Ausnahmen • Eine Ausnahme (exception) ist ein Ereignis, das den normalen Ablauf eines Programms beeinflusst. • Ursache 1: Programmierfehler: - Zugriff auf ein Feld mit falschem Index - Zugriff auf Objekt ohne gültige Referenz - Fehler bei arithmetischen Berechnungen • Ursache 2: Zugriff auf nicht vorhandene Betriebsmittel - zu wenig vorhandener Speicherplatz • Java besitzt einen allgemeinen Mechanismus, um Ausnahmen abzufangen, die sog. Ausnahmebehandlung. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-2 Verwobene Ausnahmebehandlung (1) Bei der traditionellen Ausnahmebehandlung erfolgt die Fehlererkennung und Reaktion stark verwoben mit dem eigentlichen Programmcode. Beispiel: Eine Methode readFile liest eine Datei gesamthaft in den Hauptspeicher ein. readFile(){ Datei öffnen und Grösse bestimmen Hauptspeicherplatz dieser Grösse reservieren Dateiinhalt im Speicher ablegen Datei schliessen} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-3 Verwobene Ausnahmebehandlung (2) Auf den ersten Blick erscheint diese Methode einfach zu implementieren. Allerdings könnten einige Probleme auftreten: • Was passiert, wenn die Datei nicht geöffnet werden kann ? • Was passiert wenn die Grösse nicht bestimmbar ist ? • Was passiert wenn nicht genug Hauptspeicherplatz zur Verfügung steht ? • Was passiert wenn der Lesevorgang scheitert ? • Was passiert, wenn die Datei nicht mehr geschlossen werden kann ? Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-4 Verwobene Ausnahmebehandlung (3) int readFile(){ int errorCode = 0; Datei öffnen; if (Datei_geöffnet){ Grösse bestimmen; Nach jeder Aktion wird gleich geprüft, ob diese erfolgreich war. if (Grösse_bestimmt){ Hauptspeicherplatz reservieren; if (Hauptspeicher_reserviert){...} else errorCode = -1; } else errorCode = -2;} else errorCode = -3; return errorCode; Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-5 Ausnahmebehandlung in Java (1) Java unterstützt eine strukturierte Fehlerbehandlung bei der der eigentliche Programmcode getrennt von der Behandlung gehalten wird. readFile(){ try{Datei öffnen; Grösse bestimmen; Hauptspeicherplatz reservieren; Ausnahmen werden ausgelöst (throw) Dateiinhalt im Speicher ablegen; Datei schliessen} catch(Datei_nicht_geöffnet){...} catch(Grösse_nicht_bestimmbar){...} catch(Speicherplatz_ungenügend){...} Ausnahmen werden abgefangen (catch) ...} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-6 Ausnahmebehandlung in Java (2) Java unterstützt das hierarchische Rückmelden von Ausnahmesituationen entlang der Methodenaufrufkette: method1(){ method1 try{ method2();} catch (Exception e){...} } method2 method2() throws Exception{ method3 method3();} method3() throws Exception{ readFile readFile();} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-7 Ausnahmebehandlung in Java (3) • Ausnahmen sind in die Objekthierarchie eingebettet. • Tritt während der Programmausführung eine Ausnahmesituation auf, erzeugt der Java-Interpreter eine Beschreibung (Exception-Objekt). • Das Exception-Objekt enthält Informationen über die Art des Fehlers. Klasse Throwable: • getMessage(): Ausgabe einer Beschreibung • printStackTrace(): Ausgabe der Aufrufkette Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-8 Klassenhierarchie der Ausnahmen Object Throwable Error Diese beiden Typen werden nicht vom Compiler geprüft (ungeprüfte Ausnahmen). Institut für Informatik Universität Basel Exception RuntimeException ...... IOException UnsupportedLookAndFeelException EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-9 Beispiel: java.util.Stack Stack s = new Stack(); s.pop(); public Object pop() Removes the object at the top of this stack and returns that object as the value of this function. Returns: The object at the top of this stack (the last item of the Vector object). Throws: EmptyStackException - if this stack is empty. Erweitert RuntimeException: Keine Kompilationsmeldung; kein try-catch zwingend. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-10 try - catch - finally • try-catch-finally ist das Sprachmittel von Java um Ausnahmesituationen zu bearbeiten. • Die Anweisung besteht aus 3 Teilen, wobei der catch-Teil bzw. der finally-Teil (aber nicht beide zugleich) fehlen kann. • Catch-Teil muss direkt nach try folgen. try{Anweisungsfolge, die Ausnahme auslösen kann } catch(SomeException e1){Ausnahmebehandlung} ... evtl. noch mehr catch-Blöcke catch(AnotherException e2){Ausnahmebehandlung} finally{Abschlussanweisungen: werden "immer" ausgeführt} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-11 Beispiel: javax.swing.UIManager try { UIManager.setLookAndFeel(layoutName); SwingUtilities.updateComponentTreeUI( getParent()); } catch (Exception exc) {...} public static void setLookAndFeel(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException Muss behandelt werden. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-12 Methodendirektive throws Falls eine Anweisung des Methodenkörpers eine geprüfte Ausnahme auslösen kann oder selber mittels der throwAnweisung eine solche auslöst, muss entweder • eine Behandlung mittels try-catch erfolgen. • eine Weiterleitung mittels der throws-Direktive erfolgen. Methodenname (Parameterteil) throws Exception{...} String readFirstLine(String FileName) throws IOException{...} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-13 Ausnahmen präzis behandeln (1) • Ausnahmen sollten so präzis wie möglich eingegrenzt werden. • Vages Abfangen: public void vage(){ double [] a = new double [10]; try{ for (int i=0; i<=10; i++) a[i]=1/i;} catch (Exception e) {System.out.println("Achtung Fehler");} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-14 Ausnahmen präzis behandeln (2) public void präzise(){ double [] a = new double [10]; try{ for (int i=0; i<=10; i++) a[i]=1/i;} catch (ArrayIndexOutOfBoundsException e) {System.out.println("Falscher Index");} catch (ArithmeticException e) {System.out.println("Arithmetischer Fehler"} Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-15 Häufig vorkommende Ausnahmen (1) Standard-Laufzeitfehler (RuntimeException) ArithmeticException ArrayStoreException ClassCastException IndexOutOfBoundsException NullPointerException EmptyStackException (java.util) Fehler (Error) StackOverflowError OutOfMemoryError Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-16 Häufig vorkommende Ausnahmen (2) Geprüfte Ausnahmen ClassNotFoundException CloneNotSupportedException InstantiationException IOException (java.io) MalformedURLException Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-17 Definieren eigener Ausnahmen Definieren einer Ausnahmeklasse abgeleitet von Exception bzw. einer der Unterklassen. class TestException extends Exception{...} Mit Hilfe der throw-Anweisung können Ausnahmen explizit vom Programm ausgelöst werden. throw new TestException("Testnachricht"); Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-18 Abschlussaktivitäten: finally Im finally-Teil werden alle Arten von Abschlussarbeiten platziert (allgemeines Aufräumen). Die Anweisungen im finally-Block werden garantiert ausgeführt und zwar immer nach dem try-Block. Folgende Varianten sind möglich: • Normales, komplettes Durchlaufen des try-Teils. • Abbruch in try mittels break, continue oder return. • Nach Ausnahme und Behandlung in catch-Teil. • Nach Ausnahme, die nicht abgefangen wurde, vor Weiterleitung nach „oben“. Sonderfall: System.exit() in try-Teil vermeiden. Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-19 Ausnahme vs. Fallunterscheidung Stack s = new Stack(); void m1(){ for (int i =1; i<=100000; i++){ if (!s.empty()) s.pop();} } void m2(){ for (int i =1; i<=100000; i++){ try{s.pop();} catch(EmptyStackException e) {} } Institut für Informatik Universität Basel EINFÜHRUNG IN DIE INFORMATIK II Lektion 6: Ausnahmebehandlung 6-20