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,throwundthrowskorrekt 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.