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.
Syntaxe : Utilisation
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.
try (resource declaration) {
// use of the resource
} catch (ExceptionType e1) {
// catch block
}
Exemple : Try...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.
import java.io.*;
public class Main {
public static void main(String[] args) {
BufferedReader br = null;
String line;
try {
System.out.println("Entering try block");
br = new BufferedReader(new FileReader("fichierInexistant.txt"));
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block => " + e.getMessage());
} finally {
System.out.println("Entering finally block");
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
System.out.println("IOException in finally block => " + e.getMessage());
}
}
}
}
Entering try block
IOException in try block => fichierInexistant.txt (Le fichier spécifié est introuvable)
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.
Exemple : Utilisation 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 :
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileNotFoundStudi {
public static void main(String[] args) {
String line;
try(BufferedReader br = new BufferedReader(new FileReader("fichierInexistant.txt"))) {
while ((line = br.readLine()) != null) {
System.out.println("Line =>"+line);
}
} catch (IOException e) {
System.out.println("IOException in try block =>" + e.getMessage());
}
}
}
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.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
while (scanner.hasNext()) {
writer.print(scanner.nextLine());
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
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.