De belangrijkste taak van try-with-resources in Java is het automatisch en correct vrijgeven van bronnen. Voor de introductie van deze constructie in Java 7, moesten programmeurs bronnen handmatig sluiten in het finally blok. Dit leidde tot duplicatie van code en vaak fouten.
In Java 6 en eerder moesten bronnen (open bestanden, streams, verbindingen) handmatig worden beheerd via finally, wat vaak leidde tot lekken.
Handmatig geschreven code voor het sluiten van bronnen is een bron van bugs, vooral bij het werken met meerdere uitzonderingen en een complexe hiërarchie van catch-blokken. Er is geen garantie dat close() wordt aangeroepen bij fouten.
Met Java 7 kwam de syntaxis try-with-resources, die een automatische aanroep van de methode close() garandeert voor elke bron die de interface AutoCloseable implementeert.
Voorbeeldcode:
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader wordt automatisch gesloten
Belangrijkste kenmerken:
AutoCloseable implementeren kunnen worden gebruikt in try-with-resources.Vraag 1: Welke interface moet een bron implementeren voor try-with-resources?
AutoCloseable. Elk object dat deze interface (of Closeable) implementeert kan worden gebruikt in de constructie.
Vraag 2: In welke volgorde worden bronnen gesloten als er meerdere zijn in try-with-resources?
Bronnen worden in omgekeerde volgorde van hun verklaring gesloten (stack-LIFO):
try (A a = new A(); B b = new B()) { ... } // b.close() wordt als eerste aangeroepen, daarna a.close()
Vraag 3: Kan je try-with-resources gebruiken voor niet-standaard objecten, bijvoorbeeld voor een netwerkverbinding waarvoor geen implementatie van AutoCloseable bestaat?
Nee, maar je kunt AutoCloseable handmatig implementeren in je klasse. Daarna wordt het object compatibel met try-with-resources.
Ontwikkelaars sloten handmatig JDBC Connection en Statement via finally. Bij het optreden van een tweede uitzondering werd de sluiting van Statement niet uitgevoerd, de verbinding «bevroor» en verstopte de fout.
Voordelen:
Nadelen:
Na de invoering van try-with-resources in de module voor het laden van bestanden worden alle streams automatisch gesloten, de code is veel korter geworden, en er zijn geen bugs met het lekken van bestanddescriptoren meer.
Voordelen:
Nadelen: