为什么这被认为是未处理的异常?
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();
以下代码由于未处理的异常而无法编译,尽管在我看来应该没有问题:
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();