Im finally-Block ausgelöste Ausnahmen unterdrücken die zuvor im try- oder catch-Block ausgelöste Ausnahme.
Java 7-Beispiel: http://ideone.com/0YdeZo
Aus Javadocs Beispiel:
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Wenn in diesem Beispiel die Methoden readLine und close beide Ausnahmen auslösen, löst die Methode readFirstLineFromFileWithFinallyBlock die vom finally-Block ausgelöste Ausnahme aus. Die vom try-Block ausgelöste Ausnahme wird unterdrückt.
Die neue try-with
Syntax von Java 7 fügt einen weiteren Schritt der Ausnahmeunterdrückung hinzu: Ausnahmen, die im try-Block ausgelöst werden, unterdrücken diejenigen, die zuvor im try-with-Teil ausgelöst wurden.
aus demselben Beispiel:
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());
}
}
Aus dem Codeblock, der der Anweisung try-with-resources zugeordnet ist, kann eine Ausnahme ausgelöst werden. Im obigen Beispiel kann eine Ausnahme aus dem try-Block ausgelöst werden, und bis zu zwei Ausnahmen können aus der try-with-resources-Anweisung ausgelöst werden, wenn versucht wird, die Objekte ZipFile und BufferedWriter zu schließen. Wenn eine Ausnahme aus dem try-Block ausgelöst wird und eine oder mehrere Ausnahmen aus der try-with-resources-Anweisung ausgelöst werden, werden die aus der try-with-resources-Anweisung ausgelösten Ausnahmen unterdrückt, und die vom Block ausgelöste Ausnahme ist diejenige Dies wird von der Methode writeToFileZipFileContents ausgelöst. Sie können diese unterdrückten Ausnahmen abrufen, indem Sie die Throwable.getSuppressed-Methode aus der vom try-Block ausgelösten Ausnahme aufrufen.
In Code aus Frage verwirft jeder Block eindeutig die alte Ausnahme und protokolliert sie nicht einmal. Dies ist nicht gut, wenn Sie versuchen, einige Fehler zu beheben:
http://en.wikipedia.org/wiki/Error_hiding