为什么允许在Java中捕获引发的异常的子类型

时间:2019-06-13 12:56:53

标签: java try-catch

我读了一本Java书,“ Java不允许您为try类主体可能无法抛出的已检查异常类型声明catch块。”

到目前为止,这是有道理的。

但是现在我问自己为什么该代码会编译:

    try {
        throw new Exception();
    } catch (IOException e) {
    } catch (Exception e) {
    }

Java允许我捕获IOException,但是显然它不会被try块抛出。

此示例是否违反了Java书中描述的规则?

2 个答案:

答案 0 :(得分:6)

  

Java允许我捕获IOException,但是显然它永远不会   被try块抛出。

因为ExceptionIOException更通用,所以编译器理解Exception也可以是IOException

这是一个示例,说明如果您尝试使用NumberFormatException而不是Exception

try {
    throw new NumberFormatException();
} catch (IOException e) {  // fail
} catch (Exception e) {
}

失败是因为NumberFormatException不通用于IOException

答案 1 :(得分:3)

对于读取此代码的程序员来说很明显,但是我想编译器将以与处理声明为抛出throw的方法调用相同的方式处理Exception语句,在这种情况下,抛出的异常很可能是IOException