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

java.io.Closeable: why throwing RuntimeException in close() works?

我不知道为什么这段代码在 Java 7:

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

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

the "throws" declaration must remain the same or use a subclass.

事实并非如此。正确的是 throws 子句必须相同或 更严格 。更严格的要么意味着抛出更严格的 Exception 类型(即子类),要么 not 声明它可以抛出异常。不能抛出异常比能够抛出更受限制。

我还应该指出,尽管此方法在其 throws 子句中没有隐式包含 throws IOException,但即使它这样做也不会与 throw new RuntimeException(); 冲突。任何方法都可以抛出 RuntimeException 的子类(又名未经检查的异常),无论在 throws.

之后写什么

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