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
类。