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