Les exceptions levées dans le bloc finally suppriment l'exception lancée plus tôt dans le bloc try ou catch.
Exemple Java 7: http://ideone.com/0YdeZo
De l' exemple de Javadoc :
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Cependant, dans cet exemple, si les méthodes readLine et close les deux lancent des exceptions, alors la méthode readFirstLineFromFileWithFinallyBlock lève l'exception levée à partir du bloc finally; l'exception lancée depuis le bloc try est supprimée.
La nouvelle try-with
syntaxe de Java 7 ajoute une autre étape de suppression des exceptions: les exceptions levées dans le bloc try suppriment celles lancées plus tôt dans la partie try-with.
du même exemple:
try (
java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {
String newLine = System.getProperty("line.separator");
String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
Une exception peut être levée à partir du bloc de code associé à l'instruction try-with-resources. Dans l'exemple ci-dessus, une exception peut être levée à partir du bloc try et jusqu'à deux exceptions peuvent être levées à partir de l'instruction try-with-resources lorsqu'il tente de fermer les objets ZipFile et BufferedWriter. Si une exception est levée à partir du bloc try et qu'une ou plusieurs exceptions sont levées à partir de l'instruction try-with-resources, alors ces exceptions levées à partir de l'instruction try-with-resources sont supprimées et l'exception levée par le bloc est celle qui est levée par la méthode writeToFileZipFileContents. Vous pouvez récupérer ces exceptions supprimées en appelant la méthode Throwable.getSuppressed à partir de l'exception levée par le bloc try.
Dans le code à partir de la question, chaque bloc rejette clairement l'ancienne exception, sans même la consigner, ce qui n'est pas bon lorsque vous essayez de résoudre certains bogues:
http://en.wikipedia.org/wiki/Error_hiding