try-catch-finally
Java
Ekkart Kleinod
•
Auf dieser Seite
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
- InputStream muss vor dem try definiert werden, damit er im catch oder danach geschlossen werden kann
- 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(); }