Overriding和exception之间的矛盾

时间:2015-01-25 12:58:18

标签: java

我正在阅读Sierra Kathe SCJP 6的书,我陷入了矛盾:

重写方法可以抛出更少或更少的异常。只是因为 重写方法“冒险”并不意味着重写子类' 例外风险相同。底线:一个重写方法不必声明它永远不会抛出的任何异常,无论它是什么 重写方法声明。

意味着如果重写方法可以抛出异常,如果子类中的相同方法抛出了exeption,但在测试之后我发现它不可能出现任何异常,如Exception或SQLException或IOException。 但是对于一些例外的NullPointerException它可以很好地工作

3 个答案:

答案 0 :(得分:3)

重写方法不能扩展基本声明引发的已检查异常集。因为如果您正在调用基类中声明的方法,则无法处理您不了解的子类抛出的异常。

NullPointerExceptionunchecked exception。任何方法都可以抛出它;它不需要在throws声明中。

答案 1 :(得分:1)

本书讨论了已检查的异常,唯一的必须被声明。

RuntimeException派生的任何异常都被视为未选中,这意味着您可以在不声明的情况下抛出它。

答案 2 :(得分:0)

任何重写方法都可以声明抛出任何未经检查的异常:

class Parent {
   abstract void m1() throws IOException {}
}

class Child {
   @Override void m1() throws IllegalArgumentException {}
}

声明未经检查的异常不会输入方法的签名,并且通常会被编译器忽略。尽管如此,它们仍被允许,因为它可能为文档目的提供优势。

上述规则是有道理的,因为无论是否声明,方法都可能抛出任何未经检查的异常。