EMZETT.
Login

try-with-resources

Kurz: Ein Sprachkonstrukt, das sicherstellt, dass eine geöffnete Ressource (Datei, Datenbankverbindung, Netzwerk-Socket) automatisch wieder geschlossen wird — auch wenn währenddessen eine Exception auftritt.

Genauer: Ohne dieses Konstrukt muss das Schließen einer Ressource manuell in einem finally-Block erledigt werden, was leicht vergessen wird und zu Ressourcen-Lecks führt (z. B. eine Datei, die offen bleibt, obwohl das Programm mit ihr fertig ist). try-with-resources übernimmt das automatische Aufräumen für jede Ressource, die ein entsprechendes “schließbar”-Verhalten implementiert.

Im Detail

Vor try-with-resources (bzw. in Sprachen ohne dieses Konstrukt) musste jede Ressource manuell in einem finally-Block geschlossen werden — und selbst dieser vermeintlich sichere Weg hat einen eigenen Fallstrick:

// Der "alte", fehleranfällige Weg
BufferedReader reader = null;
try {
    reader = new BufferedReader(new FileReader("datei.txt"));
    System.out.println(reader.readLine());
} finally {
    if (reader != null) {
        reader.close();   // muss manuell geprüft und aufgerufen werden
    }
}

Mit try-with-resources reduziert sich das auf eine einzige, deutlich weniger fehleranfällige Zeile:

try (BufferedReader reader = new BufferedReader(new FileReader("datei.txt"))) {
    System.out.println(reader.readLine());
}   // reader.close() wird HIER automatisch aufgerufen - auch bei einer Exception

Der entscheidende Vorteil zeigt sich, sobald mehrere Ressourcen gleichzeitig offen sind: Im manuellen finally-Ansatz muss jede einzeln und in der richtigen (umgekehrten) Reihenfolge geschlossen werden, was den Code schnell unübersichtlich macht. try-with-resources erlaubt mehrere Ressourcen einfach durch Semikolon getrennt in derselben Klammer, und kümmert sich zuverlässig um das korrekte, vollständige Schließen aller — selbst wenn beim Öffnen der zweiten Ressource bereits ein Fehler auftritt, wird die erste trotzdem sauber geschlossen.

Damit eine Ressource in try-with-resources verwendet werden kann, muss sie ein bestimmtes “schließbar”-Verhalten implementieren (in Java das AutoCloseable-Interface) — das ist der Grund, warum das Konstrukt nicht für beliebige Objekte funktioniert, sondern nur für solche, die explizit als “Ressource, die geschlossen werden muss” gekennzeichnet sind.

Siehe auch: Exceptions, Files