为什么这被认为是未处理的异常?

Why is this considered an unhandled exception?

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

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 视为仍然抛出已检查异常?覆盖方法没有!

不幸的是,不,编译器并不明显。

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

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

您可以使用

修复它

1.

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

2.

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