Zum Hauptinhalt

Fehlerbehandlung

Hier lernst Du, wie du mit Fehlern bei der Programmierung umgehst.

Hierarchie der Exceptions


Die Exceptions in Java sind durch verschiedene Klassen dargestellt. Diese Klassen wiederum sind in einer hierarchischen Struktur angeordnet. Es folgt eine Liste der für uns wichtigsten Exceptions.

  • Exception
     Die Klasse Exception ist die Basisklasse. Immer wenn man sagen möchte, dass man irgendeine beliebige Exception abfangen möchte so gibt man diesen Typ an. 
    • RuntimeException
       Die Ausprägungen dieser Klasse können während der Ausführung eines Programms theoretisch überall auftreten. Aus diesem Grund erzwingt der Compiler auch keine Behandlung dieser Exceptions. Man nennt dies “unchecked” Exceptions. Alle anderen Exceptions sind “checked” Exceptions, für die der Compiler eine Behandlung erzwingt. 
      • ArithmeticException
         Sie tritt auf, wenn das Programm eine Berechnung durchführen soll, die mathematisch nicht möglich ist. Zum Beispiel dividieren durch 0.
      • NullPointerException
         Eine NullPointerException tritt auf, wenn auf eine Eigenschaft oder eine Methode eines Objektes zugegriffen wird, das den Wert null hat.
      • IndexOutOfBoundsException
         Bei der Verwendung von Arrays kann es passieren, dass man auf einen Index zugreifen möchte, der zu groß oder kleiner als 0 ist. In diesen Fällen tritt eine IndexOutOfBoundsException auf.
    • IOException
       Alle IOExceptions signalisieren, dass bei der Eingabe oder der Ausgabe von Daten ein Fehler aufgetreten ist. 
      • FileNotFoundException
         Sie signalisiert, dass eine Datei nicht existiert.
      • EOFException
         Wird das Ende einer Eingabedatei unerwartet früh erreicht, so tritt eine EOFException auf.
    • ParseException
       Bei dem Versuch aus einem String zum Beispiel eine Zahl der ein Datum zu extrahieren kann es zu Fehlern kommen, wenn der String nicht korrekt formatiert ist.
Auch wenn wir in diesem Kurs damit auskommen nur die Klasse Exception zu behandeln, wollen wir noch kurz auf die Möglichkeiten schauen, die uns diese Hierarche bietet.

Bei der Deklaration von Methoden können nach dem throws Schlüsselwort mehrere Exception-Klassen durch Komma getrennt aufgeführt werden. So könnte man zum Beispiel angeben, dass ParseException und EOFException nicht behandeln wird. Der Compiler weiß dann aber, dass falls eine Datei geöffnet werden soll, er die Behandlung einer FileNotFoundException erzwingen soll.


 public static int readNumberFromFile(File file) throws ParseException, EOFException {
     try {
         // lese Dateiinhalt und wandle ihn in eine Zahl um
     } catch (FileNotFoundException e) {
         // verwende einen Standardwert
     }
 }

Das Beispiel zeigt, wie man dem Compiler mitteilt, wie man mit unterschiedlichen Exceptionklassen umgehen möchte.

Eine andere Möglichkeit ist, dass man in einem Try-Catch mehrere unterschiedliche Exceptionklassen behandeln kann. Dafür kann man mehrere catch-Blöcke aneinander reihen.


 try {
     leseDatei(datei);
 } catch(NullpointerException e) {
     // könnte auftreten, wenn datei null ist
 } catch(FileNotFound e) {
     // könnte auftreten wenn die Datei nicht existiert
 } catch(IOException e) {
     // könnte auftreten wenn andere Leseprobleme auftreten
 } catch(Exception e) {
     // fängt alle übrigen Fehler auf
 }
Im Beispiel ist zu sehen, wie mehrere unterschiedliche Exceptionklassen abgefangen werden können. Es ist dabei wichtig, dass zuerst die speziellen Fälle benannt werden und erst später die allgemeinen Fälle.