Je m'attends à ce que le lecteur tamponné et le lecteur de fichiers se ferment et que les ressources soient libérées si l'exception est lancée.
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
try (BufferedReader br = new BufferedReader(new FileReader(filePath)))
{
return read(br);
}
}
Cependant, est-il nécessaire d'avoir une catch
clause pour une clôture réussie?
ÉDITER:
Essentiellement, le code ci-dessus en Java 7 est-il équivalent au code ci-dessous pour Java 6:
public static Object[] fromFile(String filePath) throws FileNotFoundException, IOException
{
BufferedReader br = null;
try
{
br = new BufferedReader(new FileReader(filePath));
return read(br);
}
catch (Exception ex)
{
throw ex;
}
finally
{
try
{
if (br != null) br.close();
}
catch(Exception ex)
{
}
}
return null;
}
java-7
try-with-resources
guépard
la source
la source
catch
de votre exemple pour Java 6. C'est-à-direcatch (Exception ex) { throw ex; }
- c'est juste relancer l'exception, ça ne fait rien, ça peut être facilement enlevé sans aucun mal. Ou est-ce que je manque quelque chose?Réponses:
C'est correct et il n'y a aucune exigence d'
catch
article. 7 doc Oracle dit que la ressource sera fermée indépendamment de savoir si une exception est en fait jeté ou non.Vous ne devez utiliser une
catch
clause que si vous souhaitez réagir à l'exception. Lacatch
clause sera exécutée après la fermeture de la ressource.Voici un extrait du tutoriel d' Oracle :
ÉDITER
Concernant la nouvelle question éditée:
Le code de Java 6 exécute
catch
lefinally
bloc et ensuite . Cela provoque l'ouverture potentielle des ressources dans lecatch
bloc.Dans la syntaxe Java 7, les ressources sont fermées avant le
catch
bloc, donc les ressources sont déjà fermées pendant l'catch
exécution du bloc. Ceci est documenté dans le lien ci-dessus:la source
Votre utilisation de try-with-resources fonctionnera correctement dans ce cas particulier, mais ce n'est pas tout à fait correct en général. Vous ne devez pas enchaîner les ressources de cette manière, car cela peut entraîner des surprises désagréables. Supposons que vous ayez une taille de tampon variable:
Supposons que quelque chose s'est mal passé et que vous ayez fini par
sz
être négatif. Dans ce cas, votre ressource de fichier (créée vianew FileReader(filePath)
) ne sera PAS fermée.Pour éviter ce problème, vous devez spécifier chaque ressource séparément comme ceci:
Dans ce cas, même si l'initialisation des
br
échecs estfile
toujours fermée. Vous pouvez trouver plus de détails ici et ici .la source
new FileReader(filePath))
ne se ferme pas au cas où unIllegalArgumentException
serait jeté lorsque sz est négatif. Le try-with-resources ne ferme-t-il pas toutes lesAutoClosable
ressources indépendamment des exceptions levées?.close()
que les variables qui ont été déclarées dans l'initialiseur try-with-resources. C'est pourquoi le séparer en deux déclarations dans cet exemple fait l'affaire.sz < 0
le constructeur lance une exception provoquera en fait une fuite de la ressource.