Exceptions
Fehler abfangen
zur Laufzeit auftretene Fehler sollen Programm nicht terminieren
• ung¨ultige Eingabe kann wiederholt werden lassen
• Fehler in einem Teil muss andere Teile nicht ber¨uhren
• pl¨otzliche Termination evtl. fatal
• . . .
gebraucht: Mechanismus, um Fehler zur Laufzeit abzufangen und zu behandeln
muss damit nat¨urlich Teil der Sprache werden
Was ist eigentlichFehler? Allgemeiner: Ausnahme/ Exception
Mechanismus
Ausnahmen werden
• geworfen: signalisiert das Auftreten, Ausf¨uhrung des Programms wird unterbrochen
• gefangen: anderer Teil des Programms ¨ubernimmt Ausf¨uhrung, normalerweise Fehlerbehandlung
• deklariert: Compiler soll Nicht-Abbruch garantieren k¨onnen verschiedene Ausnahmen erfordern i.A. verschiedene Behandlungen Mechanismus f¨ur Verschiedenheit in Java vorhanden:
Klassenhierarchie mit Vererbung
Fehler- und Ausnahmenmodellierung
• Throwable: formalisiert allgemein Ausnahmen
• Error: Abnormalit¨aten, die
normalerweise zu Programmabbruch f¨uhren
sollten nicht gefangen werden
• Exception: unerwartete / unerw¨unschte Situationen sollten gefangen werden
• RuntimeException: Fehler in der Programmlogik
sollten erst gar nicht auftreten, also auch nicht gefangen werden
RuntimeExceptions
typische RuntimeExceptions:IndexOutOfBoundsException, NullPointerException, etc.
Auftreten kann eigentlich vorher ausgeschlossen werden
sollten nicht gefangen werden, denn was w¨urde Fehlerbehandlung schon besser machen?
RuntimeExceptions sindunchecked: m¨ussen im Gegensatz zu Unterklassen vonException nicht deklariert werden
Idee dahinter: Laufzeitfehler sind unvorhergesehen, k¨onnen praktisch in jeder Methode auftreten
Ausnahmen in Java
Ausnahmen werfen mitthrow e, wobeie vom Typ Throwable (besser:Exception)
Ausnahmen fangen:
try c catch (E1 e1)c1 . . .catch (E1 e1)cn
Blockc wird ausgef¨uhrt
beim Auftreten einer Ausnahmee wird kleinstes i gesucht, sodass e Typ Ei hat
Blockci wird ausgef¨uhrt
Finally
Programmfluss kann durch Ausnahmen unterbrochen werden, bevoressentieller Code ausgef¨uhrt wurde; Bsp.:EOFException beim Lesen aus einer Datei
essentieller Code (z.B. Datei schließen) kann dennoch automatisch ausgef¨uhrt werden (auch ohne Exception!)
FileReader reader;
try {
reader = new FileReader("meineLieblingsDatei.txt");
while (true) { reader.read();
}
} catch (FileNotFoundException e) {
System.out.println("Gibt’s nicht. Schade.");
} catch (IOException e) {
System.out.println("Heute genug getan.");
} finally { reader.close();
}
Ausnahmen deklarieren
kann eine Exception, die nicht RuntimeException ist, in einer Methode auftreten, so muss dies deklariert werden
class NichtsFunktioniert extends Exception { ... } class A {
...
public void probierMal() throws NichtsFunktioniert { ...
throw new NichtsFunktioniert();
...
} ...
}
nicht n¨otig, falls Ausnahme innerhalb der Methode gefangen wird
Zu beachten
• Ausnahmen selbst definieren falls n¨otig
• try-Bl¨ocke verlangsamen Code nicht, auftretende Ausnahmen aber schon
• Ausnahmen nicht zur Steuerung des Kontrollflusses (wie z.B.
break) einsetzen
• Ausnahmen sind wirklich Teil der Sprache: k¨onnen z.B. auch in catch-Teilen auftreten
• Ausnahmen so speziell wie m¨oglich abfangen und wirklich behandeln, nicht
catch (Exception e) { e.printStackTrace(System.err); }
• Ausnahmen in JavaDoc-Dokumentation nicht vergessen