Java try-with-resources (avec des exemples)

Dans ce didacticiel, nous allons découvrir l'instruction try-with-resources pour fermer automatiquement les ressources.

L' try-with-resourcesinstruction 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-resourcesinstruction par,

  1. déclarer et instancier la ressource dans la tryclause.
  2. 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-resourcesdé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.txtfichier.

La déclaration et l'instanciation du BufferedReader dans l' try-with-resourcesinstruction garantit que son instance est fermée, que l' tryinstruction 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-resourcesinstruction lorsque:

  • Le fichier test.txtest introuvable.
  • Fermer l' BufferedReaderobjet.

Une exception peut également être levée à partir du trybloc car la lecture d'un fichier peut échouer pour de nombreuses raisons à tout moment.

Si des exceptions sont levées à la fois à partir du trybloc et de l' try-with-resourcesinstruction, l'exception du trybloc est levée et l'exception de l' try-with-resourcesinstruction 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 trybloc.

Cette méthode renvoie un tableau de toutes les exceptions supprimées. Nous obtenons les exceptions supprimées dans le catchbloc.

 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 finallybloc 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 finallyblock pour nettoyer les ressources rend le code plus complexe.

Vous avez également remarqué le try… catchbloc dans le finallybloc? En effet, un IOExceptionpeut également se produire lors de la fermeture de l' BufferedReaderinstance à l'intérieur de ce finallybloc, de sorte qu'elle est également interceptée et gérée.

L' try-with-resourcesinstruction 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-resourcesinstruction 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, Scannerobject lit une ligne du testRead.txtfichier et l'écrit dans un nouveau testWrite.txtfichier.

Lorsque plusieurs déclarations sont effectuées, l' try-with-resourcesinstruction ferme ces ressources dans l'ordre inverse. Dans cet exemple, l' PrintWriterobjet est d'abord fermé, puis l' Scannerobjet est fermé.

Amélioration de Java 9 Try-with-Resources

Dans Java 7, il existe une restriction à l' try-with-resourcesinstruction. 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-resourcesinstruction 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.

Articles intéressants...