try-catch-finally


Java
Ekkart Kleinod  • 

Anwendungsbeispiel: ein Datenstrom soll geöffnet, gelesen und geschlossen werden. Dabei können IO-Fehler (und andere Fehler) auftreten, die abgefangen werden sollen. Tritt ein Fehler auf, soll der Strom geschlossen werden.

Die Ad-hoc-Lösung und deren Verbesserung dienen seit Java 8 nur noch der Darstellung des Anwendungsprinzips von finally.

Ad-hoc-Lösung

InputStream stmIn = null;
try {
    stmIn = new InputStream(...);
    stmIn.read();
    stmIn.close();
} catch (Exception e) {
    e.printStackTrace();
    if (stmIn != null) {
        try {
            stmIn.close();
        } catch (Exception e) {
            // ignorieren
        }
    }
}

Nachteile

  1. InputStream muss vor dem try definiert werden, damit er im catch oder danach geschlossen werden kann
  2. zweimaliger Aufruf von close, bei jeder Codeänderung ist das ein potentieller Fehlerfall

Verbesserung durch Einsatz von finally

try {
    InputStream stmIn = null;
    try {
        stmIn = new InputStream(...);
        stmIn.read();
    } finally {
        if (stmIn != null) {
            stmIn.close();
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

Lösung mit Java 8

Das konkrete Dateistromproblem wurde endlich in Java 8 mit einer eleganten Lösung angegangen, das Schließen des Datenstroms wird automatisch übernommen:

try (InputStream stmIn = new InputStream(...)) {
    stmIn.read();
} catch (Exception e) {
    e.printStackTrace();
}