我读了一本Java书,“ Java不允许您为try类主体可能无法抛出的已检查异常类型声明catch块。”
到目前为止,这是有道理的。
但是现在我问自己为什么该代码会编译:
try {
throw new Exception();
} catch (IOException e) {
} catch (Exception e) {
}
Java允许我捕获IOException
,但是显然它不会被try块抛出。
此示例是否违反了Java书中描述的规则?
答案 0 :(得分:6)
Java允许我捕获IOException,但是显然它永远不会 被try块抛出。
因为Exception
比IOException
更通用,所以编译器理解Exception
也可以是IOException
。
这是一个示例,说明如果您尝试使用NumberFormatException
而不是Exception
try {
throw new NumberFormatException();
} catch (IOException e) { // fail
} catch (Exception e) {
}
失败是因为NumberFormatException
不通用于IOException
。
答案 1 :(得分:3)
对于读取此代码的程序员来说很明显,但是我想编译器将以与处理声明为抛出throw
的方法调用相同的方式处理Exception
语句,在这种情况下,抛出的异常很可能是IOException
。