在 中引发的异常最终会阻止在 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 并关闭两个抛出异常,则方法 readFirstLineFromFileWithFinallyBlock 将引发从 finally 块引发的异常;从 try 块引发的异常被抑制。
Java 7 的新语法增加了异常抑制的另一个步骤:在 try 块中引发的异常会抑制在 try-with 部分中较早抛出的异常。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 语句最多可以引发两个异常。如果从 try 块引发异常,并且从 try-with-resources 语句引发一个或多个异常,则从 try-with-resources 语句引发的那些异常将被抑制,并且该块引发的异常是由 writeToFileZipFileContents 方法引发的异常。可以通过从 try 块引发的异常中调用 Throwable.getSuppressed 方法来检索这些被禁止的异常。
在有问题的代码中,每个块都明显地丢弃了旧的异常,甚至没有记录它,当你试图解决一些错误时,这是不好的:
http://en.wikipedia.org/wiki/Error_hiding