Las excepciones lanzadas finalmente en el bloque suprimen la excepción lanzada anteriormente en el bloque try o catch.
Ejemplo de Java 7: http://ideone.com/0YdeZo
Del ejemplo 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();
}
}
Sin embargo, en este ejemplo, si los métodos readLine y cierran ambas excepciones de lanzamiento, entonces el método readFirstLineFromFileWithFinallyBlock arroja la excepción lanzada desde el último bloque; se suprime la excepción lanzada desde el bloque try.
La nueva try-with
sintaxis de Java 7 agrega otro paso de supresión de excepciones: las excepciones lanzadas en el bloque try suprimen las lanzadas anteriormente en la parte try-with.
del mismo ejemplo:
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());
}
}
Se puede lanzar una excepción desde el bloque de código asociado con la instrucción try-with-resources. En el ejemplo anterior, se puede lanzar una excepción desde el bloque try, y se pueden lanzar hasta dos excepciones desde la instrucción try-with-resources cuando intenta cerrar los objetos ZipFile y BufferedWriter. Si se lanza una excepción desde el bloque try y se lanzan una o más excepciones desde la declaración try-with-resources, entonces se suprimen esas excepciones lanzadas desde la declaración try-with-resources, y la excepción lanzada por el bloque es la eso es arrojado por el método writeToFileZipFileContents. Puede recuperar estas excepciones suprimidas llamando al método Throwable.getSuppressed desde la excepción lanzada por el bloque try.
En el código de la pregunta, cada bloque descarta la antigua excepción, ni siquiera lo registra, lo que no es bueno cuando intenta resolver algunos errores:
http://en.wikipedia.org/wiki/Error_hiding