gpt4 book ai didi

java - SCJP - 使用异常处理的重写方法会引发编译器错误

转载 作者:行者123 更新时间:2023-11-30 02:43:25 27 4
gpt4 key购买 nike

Kathey Sierra 的 SCJP 书中摘录如下:

<小时/>

If a method is overridden but you use a polymorphic (supertype) reference to refer to the subtype object with the overriding method, the compiler assumes you’re calling the supertype version of the method. If the supertype version declares a checked exception, but the overriding subtype method does not, the compiler still thinks you are calling a method that declares an exception (more in Chapter 5).

Let’s take a look at an example:

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
}
}

This code will not compile because of the Exception declared on the Animal eat() method. This happens even though, at runtime, the eat() method used would be the Dog version, which does not declare the exception.

<小时/>

现在我不明白的是,a.eat(); 为什么会引发编译器错误?(即使 Super 存在异常,child 中的重写函数也可能不会出现任何异常)

最佳答案

编译器不知道所引用对象的真实类型。它仅检查分配是否有效。

a.eat 的调用会导致编译错误,因为编译器不知道 a 引用的 Animal 是 Dog2。它仅根据引用 Dog2 的变量的类型来决定是否可以抛出已检查的异常。

编译器并不聪明。它不运行代码,也不跟踪分配给变量a 的对象的实际类。

正如当您使用其父类(super class)的类型引用对象时,您不会看到特定于子类的方法一样,您也会看到父类(super class)的 throws 子句,而不是子类方法的 throws 子句。

如果在最后一行向子类添加强制转换:

((Dog2)a).eat();

那么你就不会得到未报告的异常编译错误。

关于java - SCJP - 使用异常处理的重写方法会引发编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40954791/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com