Java异常作为已检查异常,但不需要在trycatch中抛出
我有这个片段Java异常作为已检查异常,但不需要在trycatch中抛出,java,exception,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 correspond
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
我知道异常也在扩展Throwable,而且是一个已检查的异常。我的异常也在扩展Throwable,这也是一个已检查的异常
我的问题是,为什么不需要在try-catch中抛出异常,而MyException是?我认为两者都是例外,那么区别是什么
如果问题很简单,很抱歉。在(粗体强调部分)中进行了解释:
如果catch
子句可以捕获选中的异常类E1,并且与catch
子句对应的try
块不会抛出作为E1子类或超类的选中异常类,则这是编译时错误,除非E1是异常
或异常的超类
我想这背后的基本原理是:
MyException
确实是一个已检查的异常。但是,未检查的异常也会扩展异常
(从运行时异常
)的可传递继承),因此,将捕获
包含异常
类从编译器执行的异常分析中排除。从运行时异常扩展的异常
将被视为未检查的异常,因此可以:
class MyException extends RuntimeException { }
try {
...
} catch (MyException e) {
}
您的异常扩展自可丢弃的
,,因此它是cheched异常。由于编译器注意到它从未被抛出,因此编译失败。使您的异常扩展异常
将解决此问题。这是因为RuntimeException
(扩展异常)是所有未检查异常的根类,因此编译器不会对此进行模拟。因此,catch异常
也将匹配所有未检查的异常<另一方面,code>MyException
是显式选中的异常,因为您继承了根Throwable
类。