java.io.Closeable:为什么在close()中抛出RuntimeException有效?

时间:2015-08-02 18:16:09

标签: java exception java-7

我不知道为什么这些代码在Java 7上编译:

class Lamb implements Closeable{
  @Override
  public void close(){
    throw new RuntimeException();   
  } 
}

Closeable抛出的方法close()抛出IOException。当覆盖一个方法时,"抛出"声明必须保持不变或使用子类。 现在,RuntimeException是"运行时"所以不需要声明(我得到这个部分)但它继承自Exception而不是IOException!你不能扩大范围,对吧?

2 个答案:

答案 0 :(得分:2)

  

“throws”声明必须保持不变或使用子类。

那不是真的。真的是throws子句必须相同或限制性更强。更严格的限制意味着抛出更严格的Exception类型(即子类),或声明它可以抛出异常。无法抛出异常比能够更具限制性。

我还应该指出,即使这个方法在throws IOException子句中没有隐含throws,即使这样做也不会与throw new RuntimeException();冲突。无论在RuntimeException之后写什么,任何方法都可以抛出throws的子类(也就是未经检查的异常)。

答案 1 :(得分:0)

RuntimeException是否继承IOException是没有任何区别的,因为RuntimeException没有参与例外检查,正如您在问题中已经承认的那样。