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子句捕获.