考虑下面的例子。
public static void main(String[] args) {
try{
throw new NullPointerException();
} finally{
throw new ClassCastException();
}
}
这仅抛出ClassCastException,并且抑制NullPointerException。这在Java SE6中也是可能的。那么为什么Suppressed Exceptions只在JavaSE7中强调。我在这里失踪的是什么?
答案 0 :(得分:3)
它与此有什么不同?是不是只有2个异常抛出最新的一个抑制前一个。
你实际上做的事情更好地描述为“替换”异常与另一个异常。 (或者更确切地说,无条件地抛出第二个例外!)
异常抑制(因为JLS使用该术语)在以下方面有所不同:
正常抑制(仅自动)发生(自动)在资源清理 try-with-resources
期间 try-with-resources
。你的例子中你所做的事情发生在任何/所有例外情况中,无论其来源如何。
通过正常抑制,可以抑制次要异常。在这种情况下,主要的例外是“被抑制”。
通过正常抑制,被抑制的异常将记录在原始异常中。在您的示例中,它被丢弃。
现在,诚然,您可以以其他方式手动使用Throwable.addSuppressedException(...)
方法。我正在描述如何打算使用。
答案 1 :(得分:0)
可以通过引用Java Specification, Section 14.20.2:
来解释此行为
- 首先执行try块,执行带有finally块的try语句。然后有一个选择:
- ......(留下快乐的道路)
- 如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则执行finally块。然后有一个选择:
- 如果finally块正常完成,那么try语句会因为抛出值V而突然完成。
- 如果finally块因为S而突然完成,那么try语句突然完成原因S(并且丢弃并抛弃值V的抛出)。
这准确描述了代码示例中的情况。