我有这个片段。
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是异常?我认为两者都是被检查的异常,所以有什么区别?
很抱歉,问题很简单。
答案 0 :(得分:5)
Java Language Specification(用粗体强调)中对此进行了解释:
如果
catch
子句可以捕获已检查的异常类E1,则是编译时错误,而不是try
块与{{ 1}}子句可以抛出一个检查过的异常类,该类是E1的子类或超类,除非E1是catch
或Exception
的超类。
我想这背后的理由是:Exception
确实是一个检查过的异常。但是,未经检查的异常也会扩展MyException
(从Exception
的传递继承),因此编译器进行的异常分析将排除包含RuntimeException
类的catch
。 / p>
答案 1 :(得分:2)
从RuntimeException
扩展过来的异常将被视为未处理的异常,所以可以:
class MyException extends RuntimeException { }
try {
...
} catch (MyException e) {
}
您的异常是从Throwable
扩展而来的,因此它是受限制的异常。由于编译器注意到它从未抛出过,所以编译失败。