JavaSE 7 - try-with-resources

Nouveautés Java 7 : fermeture automatique des ressources


Dans plusieurs APIs de Java, il est nécessaire de clore les ressources utilisées. C'est le cas pour JDBC ou IO et plus généralement pour celle utilisant des ressources externes. Pour éviter la fuite de ressources, il est nécessaire de mettre l'appel de la méthode de clôture dans un bloc finally. Si on ajoute à cela la gestion des exceptions, généralement validées (checked), on obtient un code très peu lisible, avec beaucoup de code qui n'a rien à voir avec l'objectif fonctionnel.

Dans l'exemple ci-dessous, on ouvre un fichier texte, qu'on lit ligne par ligne.

       BufferedReader br;
       try {
           br = new BufferedReader(new FileReader("."));
           try {
               System.out.println(br.readLine());
           } catch (IOException e) {
               System.err.println("Problème de lecture du fichier");                
           } finally {
               try {
                   br.close();
               } catch (IOException ex) {                    
               }
           }
       } catch (FileNotFoundException ex) {
           System.err.println("Fichier non trouvé");
       }

Dans cette portion, on commence par ouvrir un flux de lecture sur le fichier et gérer l'exception d'absence de fichier. Puis on lit le fichier ligne à ligne, ce qui peut provoquer une exception d'entrée-sortie. On clôt le flux dans le finally, ce qui peut provoquer une exception d'entrée-sortie qui ne doit pas être traitée sous peine de masquer l'exception de lecture. Ça fait beaucoup de code pour lire un fichier texte...

Le try-with-resource permet de déclarer la ressource à clore dans le try, ce qui en simplifie grandement la structure.

       try (BufferedReader br = new BufferedReader(new FileReader("."))) {
           System.out.println(br.readLine());
       } catch (IOException e) {
           System.err.println("Problème de lecture du fichier");
       }

Cette notation peut être utilisée pour n'importe quelle classe qui implémente la nouvelle interface java.lang.AutoCloseable.