10. Ausnahmen (Exceptions)

Notwendigkeit von Ausnahmebehandlung

Beim Ausführen von Programmen können Ereignisse auftreten die nicht zum normalen Ablauf gehören und trotzdem sinnvoll behandelt werden müssen. Nicht normaler Ablauf bedeutet hier, dass diese Ausnahmen nicht direkt von den Eingaben oder Anweisungen des Programmcodes hervorgerufen werden. Beispiele hierfür sind

  • Division einer Ganzzahl durch Null
  • Lesen aus einer Datei die nicht vorhanden ist
  • Fehlende Resourcen wie Hauptspeicher
  • Verlust einer Netzwerkverbindung
  • Feldüberlauf etc.

Es ist guter (und erforderlicher) Programmierstil mit solchen Ausnahmen umgehen zu können und sie angemessen behandeln.

Zur Erkennung und Behandlung solcher abnormaler Situationen gibt es eine Reihe von Möglichkeiten die von der gewählen Technologie abhängen können:

  • Präventives Kontrollieren von potentiellen Aushnahmen
    • Beispiel: Prüfung von Eingabewerten oder Zwischenwerten von Berechnungen auf potentielle Sonderdebingungen wie Nullwerte oder Feldgrenzenüberläufe
  • Fehlercoderückgaben bei jedem Operationsaufruf
    • Unixkommandos geben Beispielsweise immer einen Fehlerwert mit aus. Ist dieser ungleich Null liegt ein bestimmter Fehler (Ausnahme) vor
  • Unterbrechungsgesteuerte (Interrupthandling) Ausnahmen
    • Der reguläre Programmablauf wird verlassen und einer anderen Stelle fortgesetzt.

Bei der Behandlung von Ausnahmen steht der Entwickler in der Regel vor dem folgenden Zielkonflikten

Zielkonflikte
niedriger Implementierungsaufwand mit hohem Fehlerrisiko hoher Implementierungsaufwand mit geringem Fehlerrisiko
übersichlicher aber wenig robuster Code unübersichtlicher (und fehleranfälliger) Code mit vielen Präventivüberprüfungen

Moderne Programmiersprachen und -umgebungen bieten eine Infrastruktur um die diese Zielkonflikte zu mildern. Die Technologie einer Rückgabe von Fehlerzuständen bei jeder einzelnen Operation macht es seht unwahrscheinlich, dass ein Entwickler bei jeder einzelnen Operation diesen Wert auswertet und individuelle Maßnahmen ergreift.

Die Programmiersprache Java unterstützt den Entwickler mit einem mächtigen Konzept zur Ausnahmebehandlung (Exceptionhandling) mit dem man Unterstützung in den folgenden Bereichen bekommt:

  • Möglichkeit Entwickler zur Behandlung von Ausnahmen zu zwingen
  • Möglichkeit  potentielle Ausnahmen in größeren Codeblöcken an einer Stelle zu behandlen
  • Objektorientierte Konzepte um Ausnahmehierarchien zu modellieren und damit die Behandlung ganzer Klasse von Ausnahmen zu erlauben

Beispiel einer Ausnahme in Java

Die Zuweisung des Ausdrucks auf die Variable c löst eine Ausnahme aus, da hier durch Null dividiert wird:

package Kurs2.Exception;
public class Beispiel {
public static void main(String args[]) {
int a = 18;
int b = 6;
int c = (a+b)/(3*b-18); int d = 17; // wird nicht erreicht
}
}

Bei der Division durch Null erzeugt Java ein Ausnahmeobjekt in dem die Ausnahme beschrieben ist. Wird die Ausnahme nicht vom Entwickler behandelt nutzt Java diese Information. Gibt sie auf der Konsole aus und beendet das Programm.

Exception in thread "main" java.lang.ArithmeticException: / by zero
at Kurs2.Exception.Beispiel.main(Beispiel.java:6)

Syntax einer Java-Ausnahme auf der Konsole

Syntax einer Ausnahme auf der Konsole

Die Klassenhierarchie des Java-Laufzeitsystems

Java verwendet eine Reihe von Klassen zur Verwaltung von Ausnahmen. Bei Auftreten von Ausnahmen werden Instanzen dieser Klassen erzeugt. Mit Hilfe dieser Instanzen kann man Ausnahmen analysieren und behandeln. Anbei ein Auszug der Klassenhierarchie des Java-Laufzeitsystems:

Exceptionklassen des Java-laufzeitsystems

Exceptions (Ausnahmen) in UML

UML benutzt Unterbechungskanten um Ausnahmen in Aktivitätsdiagrammen zu beschreiben. Unterbrechungskanten werden als Pfeile in Form eines Blitzes gezeichnet. Die Ausnahmebedingung wird in rechteckigen Klammern an der Unterbrechungskante dokumentiert. Da folgende Beispiel zeigt das Sortieren von Personen welches abgebrochen wird wenn eine Person eine leere Zeichenkette für den Nachnamen besitzt.

UML Notation mit Pfeil in Blitzform

UML Notation mit Aktivitätspfeil
und separatem Blitzsymbol

Weiterführende Quellen