Le try-with-resources

Objectifs

  • Comprendre le mécanisme du try-with-resources du gestionnaire d'exceptions pour la capture et la gestion des exceptions

  • Comprendre pourquoi et quand utiliser le bloc try-with-resources par rapport au mécanisme try-catch-finally

Mise en situation

Le try-with-resources : il 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.

SyntaxeUtilisation

En termes simples, pour être fermée automatiquement, une ressource doit être à la fois déclarée et initialisée à l'intérieur de la clause du mot-clé try.

1
try (resource declaration) {
2
  // use of the resource
3
} catch (ExceptionType e1) {
4
  // catch block
5
}

ExempleTry...catch...finally

Généralement, lorsque nous utilisons des ressources telles que des flux, des connexions, etc., nous devons les fermer explicitement en utilisant le bloc finally.

1
import java.io.*;
2
3
public class Main {
4
    public static void main(String[] args) {
5
        BufferedReader br = null;
6
        String line;
7
        try {
8
            System.out.println("Entering try block");
9
            br = new BufferedReader(new FileReader("fichierInexistant.txt"));
10
            while ((line = br.readLine()) != null) {
11
                System.out.println("Line =>"+line);
12
            }
13
        } catch (IOException e) {
14
            System.out.println("IOException in try block => " + e.getMessage());
15
        } finally {
16
            System.out.println("Entering finally block");
17
            try {
18
                if (br != null) {
19
                    br.close();
20
                }
21
            } catch (IOException e) {
22
                System.out.println("IOException in finally block => " + e.getMessage());
23
            }
24
        }
25
    }
26
}
1
Entering try block
2
IOException in try block => fichierInexistant.txt (Le fichier spécifié est introuvable)
3
Entering finally block

Comme nous pouvons le voir dans l'exemple ci-dessus, l'utilisation du bloc finally pour nettoyer les ressources rend le code plus complexe.

Avez-vous également remarqué le bloc try-catch dans le bloc finally ?

En effet, une exception de type IOException peut également se produire lors de la fermeture de l'instance BufferedReader à l'intérieur de ce bloc.

L’instruction try-with-resources effectue une gestion automatique des ressources.

Nous n'avons pas besoin de fermer explicitement les ressources car JVM les ferme automatiquement. Cela rend le code plus lisible et plus facile à écrire.

ExempleUtilisation du try-with-resources à la place du try...catch...finally

Remplaçons le code du try-catch-finally de l'exemple ci-dessus par try-with-resources :

1
import java.io.BufferedReader;
2
import java.io.FileReader;
3
import java.io.IOException;
4
5
public class FileNotFoundStudi {
6
    public static void main(String[] args) {
7
        String line;
8
        try(BufferedReader br = new BufferedReader(new FileReader("fichierInexistant.txt"))) {
9
            while ((line = br.readLine()) != null) {
10
                System.out.println("Line =>"+line);
11
            }
12
        } catch (IOException e) {
13
            System.out.println("IOException in try block =>" + e.getMessage());
14
        }
15
    }
16
}
1
IOException dans le block try => fichierInexistant.txt (Le fichier spécifié est introuvable)

Le programme est maintenant succinct.

Remarque

Pour utiliser une classe avec une instruction try-with-resources, elle doit implémenter l'interface AutoCloseable et la méthode close() de celle-ci est appelée automatiquement lors de l'exécution.

Vous pouvez déclarer plusieurs classes dans l'instruction try-with-resources.

1
import java.io.*;
2
import java.util.*;
3
4
public class Main {
5
    public static void main(String[] args) throws IOException{
6
        try (Scanner scanner = new Scanner(new File("testRead.txt"));
7
             PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
8
            while (scanner.hasNext()) {
9
                writer.print(scanner.nextLine());
10
            }
11
        } catch (FileNotFoundException e) {
12
            System.out.println(e.getMessage());
13
        }
14
    }
15
}
1
testRead.txt (Le fichier spécifié est introuvable)

La ressource déclarée au bloc try est implicitement déclarée comme finale.

SyntaxeÀ retenir

  • L' instruction try-with-resources ferme toutes les ressources qui implémentent l'interface AutoCloseable.

  • Avec le try-with-resources, le bloc du finally n'est plus obligé de fermer les ressources et rend le code plus succinct par rapport au try-catch-finally.