Fehlerbehandlung mit Exceptions

Du lernst die Grundlagen des Exception Handlings kennen: try, catch, throw, throws sowie typische Fehlerarten und wie du sie vermeidest.

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 und throws korrekt verwenden.
  • Ich weiss, wie ich NullPointerExceptions vermeide.
  • Ich weiss, warum Exceptions nicht als Kontrollstruktur verwendet werden sollten.
⏱️ Geschätzte Lesezeit: 30 Minuten

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:

1
2
3
4
5
try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.err.println("Division durch 0 ist nicht erlaubt!");
}

Optional kann ein finally-Block folgen, der immer ausgeführt wird:

1
2
3
finally {
    System.out.println("Ich werde auf jeden Fall ausgeführt.");
}

throw und throws

Mit throw wird eine Exception ausgelöst. Mit throws gibt man an, dass eine Methode eine Exception auslösen könnte:

1
2
3
4
5
public void checkAge(int age) throws IllegalArgumentException {
    if (age < 0) {
        throw new IllegalArgumentException("Alter darf nicht negativ sein");
    }
}

NullPointerException vermeiden

Ein häufiger Fehler ist das Zugreifen auf null:

1
2
String name = null;
System.out.println(name.length()); // NullPointerException!

Abhilfe schafft ein Guard:

1
2
3
if (name != null) {
    System.out.println(name.length());
}

Oder ein else-Zweig für den Fehlerfall:

1
2
3
4
5
if (name != null) {
    System.out.println(name.length());
} else {
    System.out.println("Kein Name vorhanden.");
}

Auch der Ternary-Operator ist möglich:

1
System.out.println(name != null ? name.length() : 0);

Exceptions ≠ Kontrollstruktur

Falsch:

1
2
3
4
5
try {
    int value = Integer.parseInt("abc");
} catch (NumberFormatException e) {
    value = 0;
}

Richtig:

1
2
3
4
5
if (input.matches("\d+")) {
    value = Integer.parseInt(input);
} else {
    value = 0;
}

Und assert?

Mit assert kann man Annahmen prüfen – bricht aber bei Fehlschlag mit einem AssertionError ab:

1
assert age >= 0 : "Alter darf nicht negativ sein";

Das funktioniert nur, wenn Java mit -ea gestartet wird (enable assertions). assert ist ein Tool zur Fehlersuche, kein Ersatz für echtes Exception Handling.


task Jetzt bist du dran. Löse bitte die folgenden Aufgaben in den Labs.


Zuletzt geändert July 28, 2025: Add Module exception handling basics (836db7324)