繁体   English   中英

Java Exception as checked Exception但不需要在trycatch中抛出

[英]Java Exception as checked Exception but not required to be thrown in trycatch

我有这个片段。

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是? 我认为两者都是检查异常所以哪个区别?

对不起,问题很简单。

它在Java语言规范中进行了解释(以粗体强调):

如果catch子句可以捕获已检查的异常类E1并且不是对应于catch子句的try可以抛出作为E1的子类或超类的已检查异常类的情况,那么这是编译时错误, 除非E1是Exception或类的超类Exception

我想这背后的基本原理是: MyException确实是一个经过检查的异常。 但是,未经检查的异常也会扩展ExceptionRuntimeException传递继承),因此从编译器执行的异常分析中排除包含Exception类的catch

RuntimeException扩展的异常将被视为未经检查的异常,所以没关系:

class MyException extends RuntimeException { }

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

}

你的异常从Throwable扩展,所以它被解除异常。 由于编译器注意到它从未被抛出,因此编译失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM