例外在finally块抛出抑制尝试或catch块早些时候抛出的异常。
Java 7的例子:http://ideone.com/0YdeZo
从Javadoc's例如:
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块抛出的异常 被抑制。
新try-with
语法的Java 7中添加例外抑制的另一步骤:在try块抛出的异常抑制这些早期扔在试穿用一部分。
来自同一个例子:
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块抛出异常 ,并且在试图关闭 ZipFile和BufferedWriter对象时,最多可以从try-with-resources语句中抛出最多两个异常 。如果从 尝试块抛出异常,并且会从 try-with-resources语句抛出一个或多个异常,那么会禁止从 try-with-resources语句抛出的异常被异常抛出,并且由异常抛出 块是由writeToFileZipFileContents方法抛出的块。您可以通过调用try块抛出的 异常中的Throwable.getSuppressed方法来检索这些被抑制的异常。
在从问题的代码,每个块明明白白丢弃旧例外,甚至没有记录它,当你试图解决一些bug并不好:
http://en.wikipedia.org/wiki/Error_hiding
+1 Ahh man,我知道这个答案。我在接受采访时被问到了这一点。理解try/catch/finally如何在堆栈上工作是一个非常好的问题。 –
只有一个打印语句可以打印一个数字(最后一个:'print(e.getMessage())')。你认为输出是'AB2C3':你认为最外层的catch块会被执行两次吗? –
在java中,在执行将控制传出catch块的指令之前,只要finally块存在,就执行finally块。如果只有finally块中的代码没有将控制权转移给外部,则执行catch块的延迟指令。 – Thomas