为什么子类方法会引发错误

时间:2020-07-04 07:40:09

标签: java throw

我尝试这段代码,编译器没有出现任何问题,我想知道Bar中的validate方法不会抛出任何东西,AssertionError或AssertionError的子类。但是在代码中Error是AssertionError的超类,所以为什么不会出现问题

abstract class Foo {
abstract void validate() throws AssertionError;
}

class Bar extends Foo {
void  validate() throws  Error  {}
}

1 个答案:

答案 0 :(得分:4)

您描述的编译器规则适用于已检查的异常。已检查的异常为ThrowableException以及所有扩展Exception的异常,但不包括RuntimeException及其子代。 AssertionErrorError都扩展了Error,这使它们未被选中。这意味着您可以将它们扔到任何地方而无需编译器抱怨。最后一种行为也适用于RuntimeException,例如NullPointerException

完整的树是这样的:

Throwable (checked)
-Exception (checked)
--RuntimeException (unchecked)
-Error (unchecked)