以下代码由于未处理的异常而无法编译,尽管在我看来应该没有问题:
class Car {
public void drive() throws Exception {
System.out.println("Driving...");
}
}
public class Sedan extends Car {
public void drive() {
System.out.println("Driving Sedan...");
}
public static void main(String[] args) {
Car c = new Sedan();
c.drive(); //unhandled exception!
}
}
编译器是否应该明白,当调用重写方法c.drive()
时,不会抛出已检查的异常?为什么仅仅因为引用是Car类型而不是类型Sedan,我们必须将驱动器视为仍然抛出已检查的异常?最重要的方法不是!
答案 0 :(得分:5)
不幸的是,不,这对编译器来说并不明显。
编译器实际上是在查看Car c
和drive
的调用。编译器不知道c
指向的对象的运行时类型。因此,它会评估Car.drive()
的方法签名,其中包含throws Exception
。
为了更清楚,如果在某些其他方法中c
被重新分配给仍会抛出此异常的某个SUV
对象,该怎么办?在调用drive
方法时,编译器无法知道对象的状态。
答案 1 :(得分:0)
您可以使用
进行修复<强> 1 强>
Sedan c = new Sedan();
c.drive();
<强> 2 强>
或
Car c = new Sedan();
((Sedan) c).drive();