Dans ce didacticiel, nous allons découvrir l'instruction try-with-resources pour fermer automatiquement les ressources.
L' try-with-resources
instruction ferme automatiquement toutes les ressources à la fin de l'instruction. Une ressource est un objet à fermer à la fin du programme.
Sa syntaxe est:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
Comme vu de la syntaxe ci-dessus, nous déclarons l' try-with-resources
instruction par,
- déclarer et instancier la ressource dans la
try
clause. - la spécification et la gestion de toutes les exceptions qui peuvent être levées lors de la fermeture de la ressource.
Remarque: l' instruction try-with-resources ferme toutes les ressources qui implémentent l'interface AutoCloseable.
Prenons un exemple qui implémente la try-with-resources
déclaration.
Exemple 1: essai avec des ressources
import java.io.*; class Main ( public static void main(String() args) ( String line; try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) ( while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) ) )
Sortie si le fichier test.txt est introuvable.
IOException dans le bloc try-with-resources => test.txt (aucun fichier ou répertoire de ce type)
Sortie si le fichier test.txt est trouvé.
Entrée du bloc try-with-resources Ligne => ligne de test
Dans cet exemple, nous utilisons une instance de BufferedReader pour lire les données du test.txt
fichier.
La déclaration et l'instanciation du BufferedReader dans l' try-with-resources
instruction garantit que son instance est fermée, que l' try
instruction se termine normalement ou lève une exception.
Si une exception se produit, elle peut être gérée à l'aide des blocs de gestion des exceptions ou du mot clé throws.
Exceptions supprimées
Dans l'exemple ci-dessus, des exceptions peuvent être levées à partir de l' try-with-resources
instruction lorsque:
- Le fichier
test.txt
est introuvable. - Fermer l'
BufferedReader
objet.
Une exception peut également être levée à partir du try
bloc car la lecture d'un fichier peut échouer pour de nombreuses raisons à tout moment.
Si des exceptions sont levées à la fois à partir du try
bloc et de l' try-with-resources
instruction, l'exception du try
bloc est levée et l'exception de l' try-with-resources
instruction est supprimée.
Récupération des exceptions supprimées
Dans Java 7 et versions ultérieures, les exceptions supprimées peuvent être récupérées en appelant la Throwable.getSuppressed()
méthode à partir de l'exception levée par le try
bloc.
Cette méthode renvoie un tableau de toutes les exceptions supprimées. Nous obtenons les exceptions supprimées dans le catch
bloc.
catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) )
Avantages de l'utilisation d'essais avec des ressources
Voici les avantages de l'utilisation de try-with-resources:
1. enfin bloquer pas nécessaire pour fermer la ressource
Avant que Java 7 n'introduise cette fonctionnalité, nous devions utiliser le finally
bloc pour nous assurer que la ressource est fermée afin d'éviter les fuites de ressources.
Voici un programme similaire à l' exemple 1 . Cependant, dans ce programme, nous avons utilisé le bloc finally pour fermer les ressources.
Exemple 2: Fermer la ressource en utilisant le bloc finally
import java.io.*; 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("test.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()); ) ) ) )
Production
Entrée du bloc try Line => ligne du fichier test.txt Entrée du bloc finally
Comme nous pouvons le voir dans l'exemple ci-dessus, l'utilisation de finally
block pour nettoyer les ressources rend le code plus complexe.
Vous avez également remarqué le try… catch
bloc dans le finally
bloc? En effet, un IOException
peut également se produire lors de la fermeture de l' BufferedReader
instance à l'intérieur de ce finally
bloc, de sorte qu'elle est également interceptée et gérée.
L' try-with-resources
instruction 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.
2. essayez avec des ressources avec plusieurs ressources
Nous pouvons déclarer plus d'une ressource dans l' try-with-resources
instruction en les séparant par un point-virgule;
Exemple 3: essayez avec plusieurs ressources
import java.io.*; import java.util.*; 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()); ) ) ) )
Si ce programme s'exécute sans générer d'exceptions, Scanner
object lit une ligne du testRead.txt
fichier et l'écrit dans un nouveau testWrite.txt
fichier.
Lorsque plusieurs déclarations sont effectuées, l' try-with-resources
instruction ferme ces ressources dans l'ordre inverse. Dans cet exemple, l' PrintWriter
objet est d'abord fermé, puis l' Scanner
objet est fermé.
Amélioration de Java 9 Try-with-Resources
Dans Java 7, il existe une restriction à l' try-with-resources
instruction. La ressource doit être déclarée localement dans son bloc.
try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code )
Si nous avions déclaré la ressource en dehors du bloc dans Java 7, cela aurait généré un message d'erreur.
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code )
Pour traiter cette erreur, Java 9 a amélioré l' try-with-resources
instruction afin que la référence de la ressource puisse être utilisée même si elle n'est pas déclarée localement. Le code ci-dessus s'exécutera maintenant sans aucune erreur de compilation.