home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Einführung

Java erzwingt die Behandlung von Fehlern, die eine Methode bzw. ein Konstruktor wirft.

Beispiel:

 

public void readFile() throws IOException

 

Es gibt zwei Möglichkeiten, diese Fehler zu behandeln:

 

1. Fehler fangen

Fehler werden in Java mit einem try-catch-Block gefangen.

Beispiel:

 

public void analyseResult() {
...
try {
...
aClass.readFile(); //Methode v. oben
...
} catch (IOException e) {
//Fehlerbehandlung hier
}
finally {
//Tu was anderes
}
}

 

Im catch-Block sollte der Code für die Fehlerbehandlung enthalten sein. Der optionale finally-Block wird in jeden Fall durchlaufen, unabhängig davon, ob ein Fehler aufgetreten ist.

 

2. Fehler weiterreichen

Falls eine Fehlerbehandlung an dieser Stelle nicht möglich oder sinnvoll ist, kann der Fehler weitergereicht werden. Beispiel:

 

public void analyseResult() throws IOException
...
aClass.readFile();
...
}

 

Der muss damit von der aufrufenden Methode bearbeitet werden. Am Ende dieser Ketten kann die main-Methode stehen, welche dann den Fehler fängt.

Objekthierarchie

Alle Fehlerklassen erben in Java von Throwable. Man unterscheidet auf der einen Seite die Errors, auf der anderen die Exceptions. Die Errors stehen mit Fehlern in der Java Virtual Machine JVM in Verbindung. Ein Abfangen ist oft nicht sinnvoll und nicht möglich.

Eine besondere Klasse an Fehlern in dieser Hierarchie sind die RuntimeExceptions, welche von Exception erben. Diese Art von Fehlern, deren prominentester Vertreter die NullPointerException ist, müssen nicht gefangen werden.

Merkregeln

     

  1. Schreibe niemals einen leeren catch-Block.
  2. Wenn eine Fehlerbarbeitung möglich ist, verarbeite Fehler so nah am Ort des Auftretens wie möglich.
    Tritt beispielsweise ein Fehler beim Schreiben eines Files auf (z.B. weil das Dateisystem voll ist) kann dieser Fehler gefangen und dem Benutzer die Möglichkeit gegeben werden, an anderer Stelle zu speichern.
  3. Fange Fehler und werfe Fehler so spezifisch wie möglich. Wenn beispielsweise in einem Codeabschnitt die Möglichkeit besteht, dass ein File nicht gefunden werden kann, dann sollte eine FileNotFoundException und nicht die generischere IOException oder gar Exception gefangen werden. 
  4. Bedenke, dass auch in catch-Blöcken Fehler auftreten können.
  5. Java stellt über 200 verschiedene Fehlerklassen zur Verfügung. Bevor eigene Klassen geschrieben werden, prüfe, ob sich die vorhandenen Klassen nicht nutzen lassen.
  6. Falls durch Vererbung eigene Fehlerklassen entworfen werden, sollte daran gedacht werden, dass dies normale Javaklassen sind, auf denen sich zusätzliche Attribute mit getter- und setter-Methoden implementieren lassen. Darüber können sehr detaillierte Informationen über den aufgetretenen Fehler weitergereicht werden.
  7. Erbe nicht von Error.
  8. Die Erzeugung von Fehlern ist aufwendig. Somit eignen sich try-catch-Blöcke nur schlecht, um erwartete "Fehler" zu behandeln.
  9. Fehler, die über Modulgrenzen geworfen werden, verstärken die Kopplung zwischen den Modulen.
  10. Am Besten ist es, Fehler zu vermeiden. Dies lässt sich beispielsweise durch das Prüfen von Übergabeparametern erreichen.