我不知道为什么这些代码在Java 7上编译:
class Lamb implements Closeable{
@Override
public void close(){
throw new RuntimeException();
}
}
Closeable抛出的方法close()抛出IOException。当覆盖一个方法时,"抛出"声明必须保持不变或使用子类。 现在,RuntimeException是"运行时"所以不需要声明(我得到这个部分)但它继承自Exception而不是IOException!你不能扩大范围,对吧?
答案 0 :(得分:2)
“throws”声明必须保持不变或使用子类。
那不是真的。真的是throws
子句必须相同或限制性更强。更严格的限制意味着抛出更严格的Exception
类型(即子类),或不声明它可以抛出异常。无法抛出异常比能够更具限制性。
我还应该指出,即使这个方法在throws IOException
子句中没有隐含throws
,即使这样做也不会与throw new RuntimeException();
冲突。无论在RuntimeException
之后写什么,任何方法都可以抛出throws
的子类(也就是未经检查的异常)。
答案 1 :(得分:0)
RuntimeException
是否继承IOException
是没有任何区别的,因为RuntimeException
没有参与例外检查,正如您在问题中已经承认的那样。