1. Exceptions - Ausnahmebehandlung
1.1 Konzeptionelle Sicherheit
1.1.1 Prämisse: Programme sollen möglichst nie abstürzen
Eines der Grundkonzepte von Java ist Sicherheit. Das bedeutet, daß es dem Programmierer leicht gemacht werden soll, absturzsichere Programme zu schreiben. Mit dem Exception-Konzept wird diese Prämisse auf elegante Weise erfüllt.
1.1.2 Signalisieren einer Aussnahmesituation
Exceptions signalisieren eine Ausnahmesituation. Eine Ausnahmeist ein Fehler, der aus dem aktuellen Kontext resultiert. Typisch für derartige Fehler sind Ein- und Ausgabefehler oder Übertragungsfehler in Netzwerken.
Ähnlich wie in C++ wird auch in Java bei Auftreten eines Ausnahmezustandes eine Instanz einer Exception-Klasse erzeugt und die Ausführung der aktuellen Methode unterbrochen.
1.1.3 Reaktion auf Exceptions definierbar
Es gibt zwei Möglichkeiten, eine Exception zu behandeln:
In welcher dieser beiden Weisen eine Exception behandelt werden soll bleibt dem Entwickler selbst überlassen und hängt im wesentlichen von der Aufgabenstellung ab.
1.2 Behandlung von Exceptions
1.2.1 Abfangen einer Exception mit einer try-Anweisung
Soll die Methode die Exception selbst behandeln, so muß der kritische Codeabschnitt in einer try-Anweisung stehen. Damit führt ein Auftreten einer Exception nicht zum Abbruch der Methode, sondern nur des Blocks in der try-Anweisung.
1.2.2 Reagieren auf eine Exception mit optionalen catch-Anweisungen
Im Anschluß an den try-Block können eine oder mehrere catch-Anweisungen stehen. catch-Anweisungsblöcke enthalten den Code für die Behandlung genau einer Fehlerklasse. Können mehrere verschiedene Fehler auftreten, so muß für jede Fehlerklasse ein separater catch-Block stehen. Nach einer Unterbrechung wird die zu der Exceptionklasse passende catch-Anweisung gesucht. Wird keine entsprechende gefunden, so wird die Methode beendet und die Exception weitergeworfen.
[Beispiel]
1.2.3 Verzeicht auf lokale Fehlerbehandlung mit der throws-Klausel im Methodenkopf
Soll keine lokale Fehlerbehandlung stattfinden, sondern die Exception weitergeworfen werden, so muß die Exceptionklasse im Methodenkopf in einer throws-Klausel stehen. Damit wird dem Compiler mitgeteilt, daß die Methode die genannten Exceptions auslösen kann. Der Compiler wird dann darauf achten, daß Programme, die diese Methode verwenden, die genannten Exceptions bearbeitet.
[Beispiel]
1.2.4 Abschlußaufgaben sicherstellen mit der finally-Anweisung
Nun kann es wichtig sein, daß in der Methode bestimmte Abschlußaufgaben ausgeführt werden. Sie würden beim Auftreten einer Exception übersprungen werden.
Um deren Abarbeitung sicherzustellen, können Anweisungen in einen finally-Block geschrieben werden. Der finally-Block kommt zur Ausführung, wenn der try-Block fehlerfrei ausgeführt wurde, oder - wenn eine Exception aufgetreten ist - nach der Abarbeitung der catch-Anweisungen, oder auch, wenn gar keine catch-Anweisungen vorhanden sind. Also immer.
(Ein Beispiel sehen wir nachher im Zusammenhang mit Dateioperationen)
1.3 Exceptions sind Objekte
Wie sind Exceptions realisiert?
Exceptions sind Objekte, die von der Klasse Throwable abgeleitet sind. Throwable enthält ein Stringelement, das Informationen über den speziellen Fehlerfall gibt. Außerdem enthält sie einen Backtrace-Verweis, der Informationen für eine Stack-Rückverfolgung enthält. Hiermit kann der Entwickler trotz mehrfachen Weiterreichens der Exception den genauen Auslöseort in Erfahrung bringen.