Java 中的抑制异常

Muk*_*lur 2 java exception

考虑下面的例子。

    public static void main(String[] args) {

        try{
            throw new NullPointerException();
        } finally{
           throw new ClassCastException();
        }

    }
Run Code Online (Sandbox Code Playgroud)

这仅抛出 ClassCastException 并且 NullPointerException 被抑制。这在 Java SE6 中也是可能的。那么为什么只在 JavaSE7 中强调抑制异常。我在这里缺少什么?

Ste*_*n C 5

与此有何不同?是不是只有 2 个异常抛出,最新的一个异常抑制了前一个。

你实际上在做什么更好地描述为用另一个“替换”异常。(或者更准确地说,丢弃第一个异常并无条件抛出第二个异常!)

异常抑制(正如 JLS 使用的术语)在以下方面有所不同:

  1. 普通抑制发生(自动)仅被抛出的异常一个try-with-resources资源清理过程中,通过try-with-resources。您在示例中所做的事情发生在任何/所有异常中,无论它们的来源如何。

  2. 通过正常抑制,次要异常被抑制。在这种情况下,主要异常被“抑制”。

  3. 正常抑制时,被抑制的异常记录在原始异常中。在您的示例中,它被丢弃。


现在,无可否认,您可以Throwable.addSuppressedException(...)通过其他方式手动使用该方法。我描述它是如何打算使用。