为什么RuntimeException在这里合法?

时间:2017-07-08 09:04:53

标签: java

这是我的代码:

 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
         //
     }  
 }

为什么编译时未经检查的异常在这里是合法的?

2 个答案:

答案 0 :(得分:1)

这是合法的,因为:

  • 限制派生方法是可以的(如果您准备捕获io异常,如果没有抛出此类异常则没有问题)。
  • 总是可以使用RuntimeException,因为它不是 checked 异常 - 所以编译器无论如何都不关心。

因此,您的子类只是覆盖了从签名中删除已检查异常的方法。

这完全取决于Liskov替换原则:我们的想法是你必须能够在派生类上对超类方法执行任何调用。

当你考虑这个要求时,很快就会发现当派生方法返回或抛出比“超类”方法“更少”时完全没问题。

答案 1 :(得分:1)

如果超类方法抛出/声明checked / compileTime异常,那么 -

子类的重写方法可以声明/抛出更窄(子类)检查异常

子类的重写方法不能声明/抛出更广泛的(超类)检查异常

子类的重写方法可以声明/抛出任何unchecked / RuntimeException

子类的重写方法可以声明/抛出相同的异常

子类的重写方法可能不会声明/抛出任何异常。