我尝试这段代码,编译器没有出现任何问题,我想知道Bar中的validate方法不会抛出任何东西,AssertionError或AssertionError的子类。但是在代码中Error是AssertionError的超类,所以为什么不会出现问题
abstract class Foo {
abstract void validate() throws AssertionError;
}
class Bar extends Foo {
void validate() throws Error {}
}
答案 0 :(得分:4)
您描述的编译器规则适用于已检查的异常。已检查的异常为Throwable
,Exception
以及所有扩展Exception
的异常,但不包括RuntimeException
及其子代。 AssertionError
和Error
都扩展了Error
,这使它们未被选中。这意味着您可以将它们扔到任何地方而无需编译器抱怨。最后一种行为也适用于RuntimeException
,例如NullPointerException
。
完整的树是这样的:
Throwable (checked)
-Exception (checked)
--RuntimeException (unchecked)
-Error (unchecked)