6

Java 7 添加了抑制异常的概念。try-with-resource 语句将资源方法抛出的异常添加close()到抑制的异常列表中,如果它们发生在另一个异常已经在堆栈上传播时。

在 try 语句的 finally 块中抛出的异常是否也会发生同样的情况,如下例所示?

try {
    throw new RuntimeException("Exception in try block.");
} finally {
    throw new RuntimeException("Exception in finally block.");
}
4

1 回答 1

6

不,抑制异常的想法是它们在隐含的 finally 中发生在资源尝试中。如果您实际上编写了自己的 finally 块,则其中抛出的异常不会被视为抑制异常。请注意,如果您有资源尝试和您自己的 finally 块,则资源尝试 close() 异常仍然被抑制,您自己的 finally 块被视为常规异常。

作为记住这一点的一种方式,Java 力求向后兼容。这意味着 finally 块中的异常您编码的工作方式与它们始终相同。只有 try with resources 的隐式 finally 会生成新的抑制异常。

于 2013-10-26T23:52:07.267 回答