【问题标题】:Why is RuntimeException legal here?为什么 RuntimeException 在这里是合法的?
【发布时间】:2017-12-12 13:24:22
【问题描述】:

这是我的代码:

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

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

【问题讨论】:

标签: java


【解决方案1】:

这是合法的,因为:

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

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

这一切都植根于 Liskov 替换原则:这个想法是,您必须能够对超类方法以及派生类执行任何可能的调用。

当您考虑此要求时,很快就会清楚,派生方法返回或抛出比超类方法“更少”的情况是完全可以的。

【讨论】:

    【解决方案2】:

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

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

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

    子类的重写方法可以声明/抛出任何未经检查的/RuntimeException

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多