我正在阅读Sierra Kathe SCJP 6的书,我陷入了矛盾:
重写方法可以抛出更少或更少的异常。只是因为 重写方法“冒险”并不意味着重写子类' 例外风险相同。底线:一个重写方法不必声明它永远不会抛出的任何异常,无论它是什么 重写方法声明。
意味着如果重写方法可以抛出异常,如果子类中的相同方法抛出了exeption,但在测试之后我发现它不可能出现任何异常,如Exception或SQLException或IOException。 但是对于一些例外的NullPointerException它可以很好地工作
答案 0 :(得分:3)
重写方法不能扩展基本声明引发的已检查异常集。因为如果您正在调用基类中声明的方法,则无法处理您不了解的子类抛出的异常。
NullPointerException
是unchecked exception。任何方法都可以抛出它;它不需要在throws
声明中。
答案 1 :(得分:1)
本书讨论了已检查的异常,唯一的必须被声明。
从RuntimeException
派生的任何异常都被视为未选中,这意味着您可以在不声明的情况下抛出它。
答案 2 :(得分:0)
任何重写方法都可以声明抛出任何未经检查的异常:
class Parent {
abstract void m1() throws IOException {}
}
class Child {
@Override void m1() throws IllegalArgumentException {}
}
声明未经检查的异常不会输入方法的签名,并且通常会被编译器忽略。尽管如此,它们仍被允许,因为它可能为文档目的提供优势。
上述规则是有道理的,因为无论是否声明,方法都可能抛出任何未经检查的异常。