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
语法增加了异常抑制的另一个步骤: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 块可以抛出一个异常,当 try-with-resources 语句尝试关闭 ZipFile 和 BufferedWriter 对象时,最多可以抛出两个异常。如果从 try 块中抛出异常,并且从 try-with-resources 语句中抛出一个或多个异常,则从 try-with-resources 语句中抛出的那些异常被抑制,并且块抛出的异常就是那个由 writeToFileZipFileContents 方法抛出。您可以通过从 try 块抛出的异常中调用 Throwable.getSuppressed 方法来检索这些抑制的异常。
在来自问题的代码中,每个块都明显丢弃旧异常,甚至没有记录它,当您尝试解决一些错误时不好:
http://en.wikipedia.org/wiki/Error_hiding