Nouveautes Java 7: Fermeture des resources

On aborde dans ce billet deux nouveautés de Java 7 (il est temps de parler de java 7) :

  • Le multicatch
  • Le try-with-resource

Ces deux nouveautés sont bien pratiques.
Elles permettent d'écrire un code concis et sûr.

Bien évidemment, Java 7 (nom de code Dolphin) est utilisé pour la démo.

Passons à la pratique.

Première nouveauté : le multicatch

Il s'agit de la possibilité d'enchaîner plusieurs exceptions dans un bloc try/catch.

Un exemple permet d'illustrer cela très rapidement:

Avec les versions antérieures à Java 7, on écrivait ce type de code :

try{
  //traitement qui pourrait genere IOException ou SQLException
  //...
}catch(IOException e){
  //traitement ...
}catch(SQLException e){
  //traitement ...
} 

En java 7 cela s'écrit ainsi:

try{
  //traitement qui pourrait genere IOException ou SQLExeception
  //...
}catch(IOException | SQLException e){
  //traitement ...
}

Lorsque le traitement effectué dans le catch est identique, on peut regrouper (enchaîner) plusieurs exceptions avec le symbole séparateur | le pipe.

Néanmoins le compilateur peut signaler une erreur lorsque la première exception est (déjà) couverte par la seconde (une parente).
Par exemple, dans le code ci-dessous, le compilateur signale l'erreur :
"The exception FileNotFoundException is already caught by the alternative IOException"

try{
   //code generant FileNotFoundException ou IOException 
}catch( FileNotFoundException | IOException e){
	//...
}

Seconde nouveauté: try-with-resource

Cette nouveauté est fort intéressante, l'adopter permet d'écrire un code plus sûr.

Il s'agit d'une nouvelle façon de faire le try( )/catch qui laisse le soin à la JVM de fermer les ressources (fichiers, connexions jdbc,..).

Résultat, un code plus concis et plus sûr.

La seule contrainte est que les ressources en question doivent implémenter l'interface AutoCloseable.

Un exemple sera plus parlant:

StringBuffer sb = new StringBuffer();
try 
  ( 
   InputStream in=new FileInputStream("/temp/tst.txt");
   InputStreamReader ins=new InputStreamReader(in); 
   BufferedReader bfr = new BufferedReader(ins)
  ) {
	String line;
	while ((line = bfr.readLine()) != null) {
		sb.append(line);
	}
}catch( IOException e){
 // ...e.printStackTrace();
}
...

Le try, du code précédent, est suivi de parenthèses à l'intérieur desquelles trois instances sont créées et nommées in, ins, bfr.

Comme ces instances implémentent l'interface AutoCloseable, la JVM se chargera de fermer les ressources.

Donc, inutile d'écrire le bloc finally qui ne sert qu'à fermer ces ressources.

C'est plus sûr et plus concis.

Ce billet peut être rapproché de access_resources pour un code meilleur.

Prochainement, je présenterai une autre nouveauté de java 7 sur nio.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.