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 ExceptionDer 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