JavaSE 7 - try-with-resources

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

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.