在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语句关联的代码块中引发异常。在上面的示例中,尝试关闭ZipFile和BufferedWriter对象时,可以从try块引发一个异常,并且try-with-resources语句可以引发两个异常。如果从try块引发异常,而从try-with-resources语句引发一个或多个异常,则将抑制从try-with-resources语句引发的那些异常,并且由该块引发的异常是一个是由writeToFileZipFileContents方法抛出的。您可以通过从try块引发的异常中调用Throwable.getSuppressed方法来检索这些受抑制的异常。
在有问题的代码中,每个块显然都在丢弃旧的异常,甚至没有记录下来,在您尝试解决一些错误时效果不佳:
http://en.wikipedia.org/wiki/Error_hiding