Java中禁止的异常

时间:2016-11-01 05:52:34

标签: java exception

考虑下面的例子。

    public static void main(String[] args) {

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

    }

这仅抛出ClassCastException,并且抑制NullPointerException。这在Java SE6中也是可能的。那么为什么Suppressed Exceptions只在JavaSE7中强调。我在这里失踪的是什么?

2 个答案:

答案 0 :(得分:3)

  

它与此有什么不同?是不是只有2个异常抛出最新的一个抑制前一个。

你实际上做的事情更好地描述为“替换”异常与另一个异常。 (或者更确切地说,无条件地抛出第二个例外!)

异常抑制(因为JLS使用该术语)在以下方面有所不同:

  1. 正常抑制(仅自动)发生(自动)在资源清理 try-with-resources期间 try-with-resources 。你的例子中你所做的事情发生在任何/所有例外情况中,无论其来源如何。

  2. 通过正常抑制,可以抑制次要异常。在这种情况下,主要的例外是“被抑制”。

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

  4. 现在,诚然,您可以以其他方式手动使用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的抛出)。
  •   

这准确描述了代码示例中的情况。

  • 首先执行try块中的语句(抛出NullPointerException)
  • 抛出的Exception(NullPointerException)的run类型与此try语句的任何catch子句的可捕获异常类不兼容,即NullPointerException没有catch语句
  • 然后执行finally块并抛出ClassCastException
  • 由于finally语句突然完成(对于ClassCastException),try语句突然完成(对于导致finally块中断的异常:ClassCastException)。 NullPointerException的抛出被丢弃并被遗忘。