Fehlerbehandlung mit Exceptions
Ziele
- Ich verstehe den Unterschied zwischen Fehlern (Errors) und Ausnahmen (Exceptions).
- Ich kenne den Unterschied zwischen Checked und Unchecked Exceptions.
- Ich kann
try
,catch
,finally
,throw
undthrows
korrekt verwenden. - Ich weiss, wie ich NullPointerExceptions vermeide.
- Ich weiss, warum Exceptions nicht als Kontrollstruktur verwendet werden sollten.
Was ist ein Fehler?
In Java unterscheidet man zwei grundlegende Arten von Fehlern:
- Error: nicht abfangbare Fehler wie z. B. Speicherüberläufe
- Exception: abfangbare Ausnahmen, die während der Programmausführung auftreten
Exceptions kann man behandeln – Errors nicht.
Checked vs. Unchecked
- Checked Exceptions: werden vom Compiler geprüft (z. B.
IOException
) - Unchecked Exceptions: entstehen zur Laufzeit (z. B.
NullPointerException
,ArithmeticException
)
Unchecked Exceptions sind oft auf Programmierfehler zurückzuführen und müssen nicht deklariert oder abgefangen werden.
try / catch / finally
Mit try
und catch
kann man eine Exception abfangen:
|
|
Optional kann ein finally
-Block folgen, der immer ausgeführt wird:
|
|
throw und throws
Mit throw
wird eine Exception ausgelöst. Mit throws
gibt man an, dass eine Methode eine Exception auslösen könnte:
|
|
NullPointerException vermeiden
Ein häufiger Fehler ist das Zugreifen auf null
:
|
|
Abhilfe schafft ein Guard:
|
|
Oder ein else
-Zweig für den Fehlerfall:
|
|
Auch der Ternary-Operator ist möglich:
|
|
Exceptions ≠ Kontrollstruktur
Falsch:
|
|
Richtig:
|
|
Und assert
?
Mit assert
kann man Annahmen prüfen – bricht aber bei Fehlschlag mit einem AssertionError
ab:
|
|
Das funktioniert nur, wenn Java mit -ea
gestartet wird (enable assertions). assert
ist ein Tool zur Fehlersuche, kein Ersatz für echtes Exception Handling.
Jetzt bist du dran. Löse bitte die folgenden
Aufgaben in den Labs.