Java异常try-catch异常与IOException

use*_*113 5 java exception

即使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.

man*_*uti 6

编译器可以准确地知道代码的哪个部分可以抛出,IOException因为它是一个经过检查的异常,因此每个可以抛出此类异常的方法都必须在方法签名中指定它.

另一方面,运行或未检查的异常并不是预期的,因为RuntimeException(未经检查的异常的父类)也扩展了类Exception,所以编译器可以使用它.