为什么这被视为未处理的例外?

时间:2016-08-23 13:21:32

标签: java override checked-exceptions

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

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,我们必须将驱动器视为仍然抛出已检查的异常?最重要的方法不是!

2 个答案:

答案 0 :(得分:5)

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

编译器实际上是在查看Car cdrive的调用。编译器不知道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();