【发布时间】:2016-12-04 02:38:11
【问题描述】:
在 Kathey Sierra 的 SCJP 书中,摘录如下:
如果一个方法被覆盖但你使用了多态(超类型) 使用覆盖方法引用子类型对象的引用, 编译器假定您正在调用 方法。如果超类型版本声明了一个检查异常,但是 覆盖子类型方法没有,编译器仍然认为你是 调用声明异常的方法(第 5 章会详细介绍)。
我们来看一个例子:
class Animal { public void eat() throws Exception { // throws an Exception } } class Dog2 extends Animal { public void eat() { /* no Exceptions */ } public static void main(String[] args) { Animal a = new Dog2(); Dog2 d = new Dog2(); d.eat(); // ok a.eat(); // compiler error - // unreported exception } }由于在 Animal 上声明了 Exception,此代码将无法编译 吃()方法。即使在运行时,eat() 也会发生这种情况 使用的方法是 Dog 版本,它没有声明 例外。
现在我不明白的是,a.eat(); 怎么会引发编译器错误?
(即使 Super 有,child 中的重写函数也可能没有任何异常)
【问题讨论】:
-
您不接受我的回答有什么具体原因吗?我不介意改变接受,但只是不接受有点奇怪......
标签: java exception overriding scjp