这是我的代码:
import java.io.*;
import java.sql.*;
import java.io.*;
import java.sql.*;
class Vehicle{
public void park()throws IOException {//compiletime checked
}
}
class Car extends Vehicle{
public void park()throws RuntimeException{//compile time unchecked
//
}
}
为什么编译时未经检查的异常在这里是合法的?
答案 0 :(得分:1)
这是合法的,因为:
因此,您的子类只是覆盖了从签名中删除已检查异常的方法。
这完全取决于Liskov替换原则:我们的想法是你必须能够在派生类上对超类方法执行任何调用。
当你考虑这个要求时,很快就会发现当派生方法返回或抛出比“超类”方法“更少”时完全没问题。
答案 1 :(得分:1)
如果超类方法抛出/声明checked / compileTime异常,那么 -
子类的重写方法可以声明/抛出更窄(子类)检查异常
子类的重写方法不能声明/抛出更广泛的(超类)检查异常
子类的重写方法可以声明/抛出任何unchecked / RuntimeException
子类的重写方法可以声明/抛出相同的异常
子类的重写方法可能不会声明/抛出任何异常。