Java异常为已检查的异常,但不需要在trycatch中抛出

时间:2018-08-27 14:10:38

标签: java exception

我有这个片段。

public final class StackOverflow{
   class MyException extends Throwable{
   }
   private void a(){
       try{
       }catch(MyException | Exception e){
       }
   }
}
exception StackOverflow.MyException is never thrown in body of corresponding try statement

我知道Exception也在扩展Throwable,这也是一个检查过的异常,而MyException也在扩展Throwable,这也使它成为了检查的异常!

我的问题是,为什么不要求在try catch中抛出异常,而MyException是异常?我认为两者都是被检查的异常,所以有什么区别?

很抱歉,问题很简单。

2 个答案:

答案 0 :(得分:5)

Java Language Specification(用粗体强调)中对此进行了解释:

  

如果catch子句可以捕获已检查的异常类E1,则是编译时错误,而不是try块与{{ 1}}子句可以抛出一个检查过的异常类,该类是E1的子类或超类,除非E1是catchException的超类。

我想这背后的理由是:Exception确实是一个检查过的异常。但是,未经检查的异常也会扩展MyException(从Exception的传递继承),因此编译器进行的异常分析将排除包含RuntimeException类的catch。 / p>

答案 1 :(得分:2)

RuntimeException扩展过来的异常将被视为未处理的异常,所以可以:

class MyException extends RuntimeException { }

try {
    ...
} catch (MyException e) {

}

您的异常是从Throwable扩展而来的,因此它是受限制的异常。由于编译器注意到它从未抛出过,所以编译失败。

相关问题