这个问题在这里已有答案:
即使try块实际上没有抛出任何异常,下面的代码也可以编译好 .
public static void main(String[] args) {
try {}
catch (Exception e) {} // compiles ok
}
但是如果使用Exception的子类替换catch,则代码将无法编译 .
public static void main(String[] args) {
try {}
catch (IOException e) {} // won't compile.
}
编译器错误是:IOException的无法访问的catch块 . 永远不会从try语句主体抛出此异常 .
当Exception和IOException都被检查异常时,为什么会出现这种情况?我正在使用Java 7 .
3 回答
编译器可以确切地知道代码的哪个部分可以抛出
IOException
,因为它是一个已检查的异常,因此每个可以抛出此类异常的方法都必须在方法签名中指定它 .另一方面,运行或未经检查的异常并不是预期的,因为
RuntimeException
(未经检查的异常的父类)也扩展了类Exception
,然后编译器就可以了 .Exception
具有未经检查的异常的子类(RuntimeException
extendsException
) .Throwable
的行为类似 .RuntimeException
或RuntimeException
的子类的行为类似 . 除RuntimeException
之外的Exception
的子类不会 .Manouti的答案似乎是正确的,但根据java文档:
抛出一个
Exception
实例有一个明确的例子(Exception
类是特殊的,有人可能会说) . 这是Java 5文档,但除非有人另外看到,否则我非常怀疑这已经发生了变化查看
Exception
和IOException
的继承树https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html
和
https://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true
在Java 7中,我认为未经检查的异常不遵循相同的规则,未经检查的异常必须从
RuntimeException
继承,Exception
当然不会(它是该类的父级)https://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#308526
(再次,Java 5文档,但它没有改变)https://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html