2

由于未处理的异常,以下代码无法编译,但在我看来应该没有问题:

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 类型,我们就必须将 drive 视为仍然抛出检查异常?覆盖方法没有!

4

2 回答 2

5

不幸的是,不,这对编译器来说并不明显。

编译器本质上是在查看Car c和调用drive. 编译器不知道c所指向对象的运行时类型。因此,它评估 的方法签名Car.drive(),其中包括throws Exception.

为了更清楚,如果在其他方法中重新分配给仍然抛出此异常c的某个对象怎么办?SUV编译器无法在drive调用方法时知道对象的状态。

于 2016-08-23T13:25:24.887 回答
0

你可以用

1.

Sedan c = new Sedan();
c.drive();

2.

或者

Car c = new Sedan();
((Sedan) c).drive();
于 2016-08-23T13:30:21.040 回答