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
不参与异常检查,正如您在问题中已经承认的那样。
我不知道为什么这段代码在 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
不参与异常检查,正如您在问题中已经承认的那样。