Die Hauptaufgabe von try-with-resources in Java besteht darin, Ressourcen automatisch und korrekt freizugeben. Vor der Einführung dieser Konstruktion in Java 7 mussten Programmierer Ressourcen manuell im finally-Block schließen. Dies führte zu Code-Duplikationen und häufigen Fehlern.
In Java 6 und früher mussten Ressourcen (offene Dateien, Streams, Verbindungen) manuell über finally verwaltet werden, was häufig zu Lecks führte.
Manuell geschriebener Code zum Schließen von Ressourcen ist eine Fehlerquelle, insbesondere beim Arbeiten mit mehreren Ausnahmen und komplexer hierarchy von catch-Blöcken. Es gibt keine Garantie, dass close() bei Fehlern aufgerufen wird.
Mit Java 7 wurde die Syntax try-with-resources eingeführt, die einen automatischen Aufruf der close()-Methode für jede Ressource, die das Interface AutoCloseable implementiert, garantiert.
Beispielcode:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader wird automatisch geschlossen
Wichtige Merkmale:
AutoCloseable implementieren, können in try-with-resources verwendet werden.Frage 1: Welches Interface muss eine Ressource für try-with-resources implementieren?
AutoCloseable. Jedes Objekt, das dieses Interface (oder Closeable) implementiert, kann in der Konstruktion verwendet werden.
Frage 2: In welcher Reihenfolge werden Ressourcen geschlossen, wenn es mehrere in try-with-resources gibt?
Ressourcen werden in umgekehrter Reihenfolge ihrer Deklaration geschlossen (Stack-LIFO):
try (A a = new A(); B b = new B()) { ... } // b.close() wird zuerst aufgerufen, dann a.close()
Frage 3: Kann man try-with-resources für nicht-standardisierte Objekte verwenden, z.B. für eine Netzwerkverbindung, für die es keine Implementierung von AutoCloseable gibt?
Nein, aber man kann AutoCloseable manuell in seiner Klasse implementieren. Danach wird das Objekt mit try-with-resources kompatibel sein.
Entwickler schlossen JDBC-Verbindung und Statement manuell über finally. Bei Auftreten einer zweiten Ausnahme wurde das Schließen des Statements nicht ausgeführt, die Verbindung „hing“ und verbarg den Fehler.
Vorteile:
Nachteile:
Nachdem try-with-resources im Modul zum Hochladen von Dateien implementiert wurde, werden alle Streams automatisch geschlossen, der Code ist viel kürzer geworden und es sind keine Lecks von Dateideskriptorm werden.
Vorteile:
Nachteile: