Fehlerbehandlung in Java: try/catch und mehr – das vollständige Handbuch

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fehlerbehandlung in Java: try/catch und mehr: von A bis Z



Fehlerbehandlung ist eines der Schlüsselkonzepte in Java, das jeder Entwickler beherrschen muss. Im Gegensatz zu vielen Sprachen bietet Java ein strenges und durchdachtes System von Exceptions, das es ermöglicht, zuverlässigen und vorhersagbaren Code zu schreiben. In diesem Artikel behandeln wir alles: vom grundlegenden try/catch bis zu fortgeschrittenen Mechanismen wie try-with-resources und benutzerdefinierten Exceptions.



1. Grundlagen: Was sind Exceptions und die Klassenhierarchie



Eine Exception ist ein Ereignis, das den normalen Programmablauf stört. In Java sind alle Exceptions Objekte von Klassen, die von Throwable erben. Die Hauptzweige der Hierarchie sind:



  • Error – Kritische Probleme, die normalerweise nicht behandelt werden (z.B. OutOfMemoryError).
  • Exception – Exceptions, die das Programm behandeln kann.
  • RuntimeException (Unterklasse von Exception) – Laufzeit-Exceptions, die zur Kompilierzeit nicht geprüft werden müssen.


Alle Exceptions werden in zwei Typen unterteilt:

  • Checked (geprüft) – Müssen behandelt werden. Der Compiler lässt den Code nicht kompilieren, wenn Sie sie nicht mit try/catch behandeln oder mit throws deklarieren. Beispiele: IOException, SQLException.
  • Unchecked (ungeprüft) – Erben von RuntimeException. Sie müssen nicht explizit behandelt werden. Beispiele: NullPointerException, ArithmeticException.


2. Der grundlegende Mechanismus: try, catch, finally



Der grundlegende Block zur Exception-Behandlung besteht aus drei Teilen:



try {    // Code, der eine Exception auslösen kann    int result = 10 / 0;} catch (ArithmeticException e) {    // Exception behandeln    System.err.println("Fehler: Division durch Null!");} finally {    // Dieser Block wird immer ausgeführt (auch wenn eine Exception aufgetreten ist)    System.out.println("Finally-Block ausgeführt.");}


Wichtige Punkte:

  • Es kann einen oder mehrere catch-Blöcke für verschiedene Exception-Typen geben.
  • Der finally-Block ist optional, aber nützlich zum Schließen von Ressourcen (Dateien, Verbindungen).
  • Wenn eine Exception nicht abgefangen wird, wird sie im Aufrufstapel nach oben weitergereicht.


Multi-catch (Java 7+) – Ermöglicht das Abfangen mehrerer Exception-Typen in einem Block:



try {    // Code} catch (IOException | SQLException e) {    System.err.println("E/A- oder SQL-Fehler: " + e.getMessage());}


3. Try-with-resources: Automatisches Schließen von Ressourcen



Seit Java 7 gibt es den Mechanismus try-with-resources, der Ressourcen, die das Interface AutoCloseable (oder Closeable) implementieren, automatisch schließt. Dies erspart das Schreiben eines finally-Blocks zum Schließen von Dateien, Sockets usw.



try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {    String line = reader.readLine();    System.out.println(line);} catch (IOException e) {    System.err.println("Fehler beim Lesen der Datei: " + e.getMessage());} // reader wird automatisch geschlossen


Vorteile:

  • Der Code wird sauberer und kürzer.
  • Ressourcen werden in der richtigen Reihenfolge geschlossen (umgekehrt zur Erstellungsreihenfolge).
  • Wenn eine Exception sowohl im try-Block als auch beim Schließen ausgelöst wird, wird die unterdrückte Exception (suppressed) zur Haupt-Exception hinzugefügt.


Sie können mehrere Ressourcen durch Semikolon getrennt deklarieren:



try (BufferedReader br = new BufferedReader(new FileReader("in.txt"));     BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"))) {    // Code}

Blogs

Buchempfehlungen