finallyブロックでスローされた例外は、tryまたはcatchブロックで以前にスローされた例外を抑制します。
Java 7の例:http : //ideone.com/0YdeZo
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();
}
}
ただし、この例では、メソッドreadLineとcloseの両方が例外をスローした場合、メソッドreadFirstLineFromFileWithFinallyBlockがfinallyブロックからスローされた例外をスローします。tryブロックからスローされる例外は抑制されます。
try-with
Java 7 の新しい構文は、例外抑制の別のステップを追加します。tryブロックでスローされた例外は、try-withパートで以前にスローされたものを抑制します。
同じ例から:
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());
}
}
例外は、try-with-resourcesステートメントに関連付けられたコードのブロックからスローできます。上記の例では、tryブロックから例外がスローされ、ZipFileオブジェクトとBufferedWriterオブジェクトを閉じようとしたときに、try-with-resourcesステートメントから最大2つの例外がスローされます。tryブロックから例外がスローされ、try-with-resourcesステートメントから1つ以上の例外がスローされた場合、try-with-resourcesステートメントからスローされた例外は抑制され、ブロックによってスローされた例外はこれは、writeToFileZipFileContentsメソッドによってスローされます。これらの抑制された例外を取得するには、tryブロックによってスローされた例外からThrowable.getSuppressedメソッドを呼び出します。
問題のコードでは、各ブロックは古い例外を明らかに破棄しており、ログに記録することすらしておらず、いくつかのバグを解決しようとしているときには適切ではありません。
http://en.wikipedia.org/wiki/Error_hiding