即使try块实际上没有抛出任何异常,下面的代码也可以编译好.
public static void main(String[] args) {
try {}
catch (Exception e) {} // compiles ok
}
Run Code Online (Sandbox Code Playgroud)
但是如果使用Exception的子类替换catch,则代码将无法编译.
public static void main(String[] args) {
try {}
catch (IOException e) {} // won't compile.
}
Run Code Online (Sandbox Code Playgroud)
编译器错误是:IOException的无法访问的catch块.永远不会从try语句主体抛出此异常.
当异常和IOException都被检查异常时,为什么会出现这种情况?我正在使用Java 7.
编译器可以准确地知道代码的哪个部分可以抛出,IOException
因为它是一个经过检查的异常,因此每个可以抛出此类异常的方法都必须在方法签名中指定它.
另一方面,运行或未检查的异常并不是预期的,因为RuntimeException
(未经检查的异常的父类)也扩展了类Exception
,所以编译器可以使用它.