[英]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
确实是一个经过检查的异常。 但是,未经检查的异常也会扩展Exception
( RuntimeException
传递继承),因此从编译器执行的异常分析中排除包含Exception
类的catch
。
从RuntimeException
扩展的异常将被视为未经检查的异常,所以没关系:
class MyException extends RuntimeException { }
try {
...
} catch (MyException e) {
}
你的异常从Throwable
扩展,所以它被解除异常。 由于编译器注意到它从未被抛出,因此编译失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.