Exceptions Einführung in Java Folie 1 von 15 12. Mai 2011 Ivo Kronenberg Inhalt • Werfen und Behandeln von Ausnahmen • Exceptionklassen (Hierarchie) • Eigene Exceptiontypen • Exceptionsignaturen • Stack Trace • Exception Chaining Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 2 von 15 Exceptions (Ausnahmen) • Laufzeitfehler: – treten zur Laufzeit auf – Beinflusen Programmablauf • Ursachen für Ausnahmen: – Logische Fehler – Bedienungsfehler – Laufzeitsystem Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 3 von 15 Ausnahmen werfen • Deklaration (Methodensignatur) und werfen: void eineMethode() throws Exception { Deklaration … von Exception throw new Exception(); Werfen } von Exception • Durch das Werfen einer Exception wird der normale Kontrollfluss einer Methode beendet (analog einem return Statement) Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 4 von 15 Ausnahmen behandeln • 1 Try-Catch Block: … try { … // regulärer Code … } catch(Exception ex) { … // Fehlerbendlung } … • Try-Block wird sofort beendet, wenn Exception geworfen wird. • Catch-Block wird nur durchlaufen, wenn eine Exception vom gefangenen Typ geworfen wird. Exceptions | Ivo Kronenberg 2 12. Mai 2011 Folie 5 von 15 Exceptionklassen • Throwable ist Basisklasse aller Exception • Fehler aus VM (Laufzeitsystem) sind typischerweise vom Typ Error. Throw able Error Exception Laufzeitsystem RuntimeException IllegalArgumentException Exceptions | Ivo Kronenberg Bedienungsfehler Logische Fehler NullPointerException 12. Mai 2011 Folie 6 von 15 Benutzerdefinierte Exceptions • Defintion neuer Exception: class ProgrammException extends Exception { ProgrammException() { super(); } } • Konstruktoren Exception: Exception() Exception(String message) Exception(String message, Throwable cause) Exception(Throwable cause) Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 7 von 15 Exceptionsignaturen • Geworfene Exceptions müssen kompatibel sein mit Exceptiontypen auf Methodensignatur. • In der Methodensignatur können mehrer Exceptiontypen deklariert werden: void methodeA() throws EOFException, FileNotFoundException {…} • Für überladene Methodensignaturen sind Exception irrelevant. • Bei Redefinition von Methode (überschreiben) dürfen Exceptiontypen eingeschränkt aber nicht erweitert werden. Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 8 von 15 Durchreichen von Exceptions • Exceptions müssen nicht abgefangen und behandelt werden. • Exceptions können an Aufrufer weitergereicht werden: class Demo { private void methodeA() throws Exception { … } public void methodeB() throws Exception { Unbehandelt methodeA(); weiterreichen } public void methodeC() throws Exception { try { methodA(); } catch(Excepion e) { … // z.B. Fehlerbehandlung Gleiche Exception throw e; weiterreichen } } } Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 9 von 15 Runtime Exceptions • Müssen nicht in Methodensignatur deklariert werden. • Häufiger Verwendung in API Klassen • Werden typischerweise geworfen, wenn logischer Check durchfällt. Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 10 von 15 Error • Müssen nicht in Methodensignatur deklariert werden. • Reserviert für Systemfehler (Laufzeitsystem). • Typischerweise sollte beim Auftreten eines Systemfehlers das Programm beendet werden. • Typische Error-Klassen in API: OutOfMemoryError NoClassDefFoundError Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 11 von 15 Mehrere Catch-Klauseln • Pro try-Block können mehrere catch-Klauseln angegebn werden. • Jede catch Klausel verarbeitet ein anderen Exception-Typ. • Zur Fehlerbehandlung kommt die erste passende catch-Klausel zum Zuge. – Reihenfolge ist entscheidend. – Nicht zwingend die am besten passende Exception. – Passt keine der Catch-Klauseln, wird die Exception automatisch weitergeworfen. Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 12 von 15 Stack Trace • Ausgabe von Stack Trace: – Throwable.printStackTrace() – Logging Frameworks – Ausserordentlich Programmbeendigung Message Exception Exception in thread "main" java.io.IOException: The system cannot find the path specified at java.io.WinNTFileSystem.createFileExclusively(Native Method) at java.io.File.checkAndCreate(File.java:1704) Call Stack at java.io.File.createTempFile(File.java:1793) at java.io.File.createTempFile(File.java:1830) at ch.sws.java.demo.exceptions.CatchKlauseln.main(CatchKlauseln.java:9) Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 13 von 15 Finally-Block • Abschlussbehandlung unabhängig von aufgetretener Exception. • Illustration: 1 try { … // regulärer code } catch(Exception ex) { … // Fehlerbehandlug } finally { … // Aufräumlogik } Exceptions | Ivo Kronenberg 2 3 Wird in jedem Fall durchlaufen 12. Mai 2011 Folie 14 von 15 Exception Chaining • Gekapselte Weitergabe von Root-Exception (Ursache): – Implementationdetails verstecken – Ursache für Aufrufer irrelevant • Konstruktoren Exception mit Cause: Exception() Exception(String message) Exception(String message, Throwable cause) Exception(Throwable cause) Throw able • -cause Abfrage Kette von Exceptions: ex.getCause(); Throw able -cause Throw able Exceptions | Ivo Kronenberg 12. Mai 2011 Folie 15 von 15