La tâche clé du try-with-resources en Java était la libération automatique et correcte des ressources. Avant l'introduction de cette construction dans Java 7, les programmeurs devaient fermer les ressources manuellement dans le bloc finally. Cela entraînait des duplications de code et des erreurs fréquentes.
Dans Java 6 et les versions antérieures, les ressources (fichiers ouverts, flux, connexions) devaient être gérées manuellement via finally, ce qui conduisait souvent à des fuites.
Le code de fermeture des ressources écrit manuellement est une source de bogues, surtout lors de la gestion de plusieurs exceptions et d'une hiérarchie complexe de blocs catch. Il n'y a aucune garantie que close() soit appelé en cas d'erreurs.
Avec Java 7, la syntaxe try-with-resources a été introduite pour garantir l'appel automatique de la méthode close() pour chaque ressource implémentant l'interface AutoCloseable.
Exemple de code :
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) { String line = reader.readLine(); System.out.println(line); } catch (IOException e) { e.printStackTrace(); } // reader se ferme automatiquement
Caractéristiques clés :
AutoCloseable peuvent être utilisés dans try-with-resources.Question 1 : Quelle interface une ressource doit-elle implémenter pour être utilisée dans try-with-resources ?
AutoCloseable. Tout objet implémentant cette interface (ou Closeable) peut être utilisé dans cette construction.
Question 2 : Dans quel ordre les ressources sont-elles fermées si plusieurs sont déclarées dans try-with-resources ?
Les ressources sont fermées dans l'ordre inverse de leur déclaration (pile-LIFO) :
try (A a = new A(); B b = new B()) { ... } // b.close() sera appelé en premier, puis a.close()
Question 3 : Peut-on utiliser try-with-resources pour des objets non standards, par exemple, avec une connexion réseau sans implémentation d'AutoCloseable ?
Non, mais il est possible d'implémenter AutoCloseable manuellement dans votre classe. Après cela, l'objet sera compatible avec try-with-resources.
Les développeurs fermaient manuellement JDBC Connection et Statement via finally. Lors de l'apparition d'une seconde exception, la fermeture de Statement n'était pas effectuée, la connexion « restait bloquée » et masquait l'erreur.
Avantages :
Inconvénients :
Après l'introduction du try-with-resources dans le module de téléchargement de fichiers, tous les flux se ferment automatiquement, le code est devenu beaucoup plus court, et les bogues de fuite de descripteurs de fichiers ont disparu.
Avantages :
Inconvénients :