1. Vue d’ensemble
La prise en charge de try-with-resources (introduite dans Java 7) nous permet de déclarer les ressources à utiliser dans un bloc try avec l’assurance que les ressources seront fermées après l’exécution de ce bloc. Les ressources déclarées doivent implémenter l’interface AutoCloseable .
2. Utiliser try-with-resources
En termes simples, pour être fermée automatiquement, une ressource doit être déclarée et initialisée à l’intérieur du try , comme indiqué ci-dessous:
try (PrintWriter writer = new PrintWriter(new File("test.txt"))) {
writer.println("Hello World");
}
3. Remplacement de try – catch-finally par try-with-resources
Le moyen simple et évident d’utiliser la nouvelle fonctionnalité try-with-resources consiste à remplacer le bloc traditionnel et détaillé try-catch-finally .
Comparons les exemples de code suivants - il s’agit en premier lieu d’un bloc try-catch-finally , puis de la nouvelle approche utilisant un bloc try-with-resources équivalent:
Scanner scanner = null;
try {
scanner = new Scanner(new File("test.txt"));
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (scanner != null) {
scanner.close();
}
}
Et voici la solution très succincte utilisant des ressources d’essai:
try (Scanner scanner = new Scanner(new File("test.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
4. try-with-resources avec plusieurs ressources
Plusieurs ressources peuvent être déclarées sans problème dans un bloc try-with-resources en les séparant par un point-virgule:
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
}
5. Une ressource personnalisée avec
__
AutoCloseable
__
Pour construire une ressource personnalisée qui sera correctement traitée par un bloc try-with-resources , la classe doit implémenter les interfaces Closeable ou AutoCloseable et remplacer la méthode close :
public class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("Closed MyResource");
}
}
6. Ordre de clôture des ressources
Les ressources définies/acquises en premier seront fermées en dernier; Voyons un exemple de ce comportement:
Ressource 1:
public class AutoCloseableResourcesFirst implements AutoCloseable {
public AutoCloseableResourcesFirst() {
System.out.println("Constructor -> AutoCloseableResources__First");
}
public void doSomething() {
System.out.println("Something -> AutoCloseableResources__First");
}
@Override
public void close() throws Exception {
System.out.println("Closed AutoCloseableResources__First");
}
}
Ressource 2:
public class AutoCloseableResourcesSecond implements AutoCloseable {
public AutoCloseableResourcesSecond() {
System.out.println("Constructor -> AutoCloseableResources__Second");
}
public void doSomething() {
System.out.println("Something -> AutoCloseableResources__Second");
}
@Override
public void close() throws Exception {
System.out.println("Closed AutoCloseableResources__Second");
}
}
Code:
private void orderOfClosingResources() throws Exception {
try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst();
AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {
af.doSomething();
as.doSomething();
}
}
Sortie:
Constructor → AutoCloseableResources First + Constructor → AutoCloseableResources Second + Quelque chose → AutoCloseableResources First + Quelque chose → AutoCloseableResources Second + Quelque chose → AutoCloseableResources First + Quelque chose → AutoCloseableResources Second + Fermeture AutoClosableResources Second Second Calcul
** 7. capture
Un bloc try-with-resources peut toujours avoir les blocs catch et finally - qui fonctionneront de la même manière qu’avec un bloc try traditionnel.
8. Conclusion
Dans cet article, nous avons expliqué comment utiliser try-with-resources, comment remplacer try , catch et finally par try-with-resources, en créant des ressources personnalisées avec AutoCloseable et en indiquant l’ordre de fermeture des ressources.
Le code source complet de l’exemple est disponible à l’adresse this GitHub .