Zum Hauptinhalt springen

Ausnahmen (Exceptions)

Programmfehler (Bugs) führen dazu, dass Programme unerwartete Ergebnisse liefern oder abstürzen. Je komplexer das Programm, desto wichtiger wird eine durchdachte und konsequente Fehlerbehandlung. Man unterscheidt dabei zwischen verschiedenen Fehlerarten: Kompilierungsfehler, Logikfehler und Laufzeitfehler.

Kompilierungsfehler sind Programmfehler, die verhindern, dass das Programm ausgeführt werden kann. Sie können relativ einfach behoben werden, da sie schon zur Designzeit auftreten und von den meisten Entwicklungsumgebungen direkt angezeigt werden.

Die Klassenhierarchie der Laufzeitfehler

Die Klasse Throwable stellt die Oberklasse aller Laufzeitfehler dar. Schwerwiegende Fehler (hauptsächlich Probleme in der JVM (Java Virtual Machine)) werden durch Unterklassen der Klasse Error abgebildet, geprüfte Ausnahmen durch Unterklassen der Klasse Exception und ungeprüfte Ausnahmen durch Unterklassen der Klasse RuntimeException.

Definition von Ausnahmenklassen

Eigene Ausnahmenklassen werden durch einfaches Ableiten von einer bestehenden Ausnahmenklasse definiert. Ausnahmenklassen sollten dabei immer von der Klasse Exception oder einer ihrer Unterklassen abgeleitet werden, nicht von der Klasse Error.

QuxException.java
public class QuxException extends Exception {

public QuxException() {}

public QuxException(String message) {}

}

Auslösen von Ausnahmen

Mit dem Schlüsselwort throw kann innerhalb einer Methode eine Ausnahme ausgelöst werden. Die Methode, in der die Ausnahme ausgelöst wird, muss mit dem Schlüsselwort throws die Ausnahmenklasse angeben, die ausgelöst werden kann.

Foo.java
public class Foo {

public void bar() throws QuxException {
throw new QuxException();
}

}

Weiterleiten von Ausnahmen

Ausnahmen können weitergeleitet werden. Hierbei wird die Fehlerbehandlung an die nächsthöhere Ebene weitergegeben. Um eine Ausnahme weiterzuleiten, muss in der weiterleitenden Methode mit throws die Ausnahme angegeben werden, die ausgelöst werden kann.

Foo.java
public class Foo {

public void bar() throws QuxException {
throw new QuxException();
}

public void baz() throws QuxException {
bar();
}

}

Abfangen von Ausnahmen

Mit Hilfe der try-catch-Anweisung können Methoden, die eine Ausnahme auslösen können, überwacht werden; d.h. die Ausnahmen werden gegebenenfalls abgefangen. Der try-Block enthält die Anweisungen, die überwacht werden sollen, der catch-Block enthält die eigentliche Fehlerbehandlung. Als Parameter von catch muss angegeben werden, welche Ausnahme(n) abgefangen werden soll(en).

MainClass.java
public class MainClass {

public static void main(String[] args) {
try {
Foo foo = new Foo();
foo.bar();
} catch (QuxException e) {
/* Fehlerbehandlung */
}
}

}