Java7多个异常处理

sud*_*d29 7 java exception-handling java-7

我一直试图找到这个问题的答案,但没有得到任何令人满意的解释.这是一些背景:

Java 7允许我们在单个catch块中捕获多个异常,前提是这些异常来自不同的层次结构.例如:

try {
    // some code

} catch(SQLException | FileNotFoundException e) {
    e.printStackTrace();
} catch(Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

但是如果异常来自同一层次结构,我们必须使用多个catch块,如:

try {
    // some code
} catch(FileNotFoundException  e) {
    e.printStackTrace();
} catch(IOException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试编写如下代码编译器抱怨"异常FileNotFoundException已被替代IOException"

try {
    // some code
} catch(FileNotFoundException | IOException  e) { // compiler error
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:为什么编译器在最后一种情况下报告错误,不能弄清楚FileNotFoundException是特殊情况IOException吗?当我的异常处理逻辑相同时,这将节省代码重复.

aio*_*obe 13

为什么编译器在最后一种情况下报告错误,是不是可以算出FileNotFoundException特殊情况IOException呢?

因为FileNotFoundException是它的子类IOException.换句话说," FileNotFoundException |"部分是多余的.

以下代码的原因是好的......

} catch(FileNotFoundException  e) {
    ...
} catch(IOException e) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

...因为这里的IOException子句很重要:SocketException例如,如果抛出a ,它将通过FileNotFoundException部分传递,并被IOException子句捕获.