我一直试图找出这个问题的答案,但没有得到令人满意的解释。以下是一些背景:
Java 7允许我们在单个catch块中捕获多个异常,只要这些异常来自不同的层次结构。例:
try {
// some code
} catch(SQLException | FileNotFoundException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}但是,如果异常来自同一层次结构,则必须使用多个catch块,如:
try {
// some code
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}但是如果我试图编写像下面这样的代码,编译器会抱怨说“异常FileNotFoundException已经被替代的IOException捕获了”。
try {
// some code
} catch(FileNotFoundException | IOException e) { // compiler error
e.printStackTrace();
}现在我的问题是:为什么编译器在最后一种情况下报告一个错误,难道它不能确定FileNotFoundException是IOException的特例吗?当异常处理逻辑相同时,这将节省代码复制。
发布于 2015-05-08 06:34:37
为什么编译器在最后一种情况下会报告一个错误,难道它不知道
FileNotFoundException是IOException的特例吗?
因为FileNotFoundException是IOException的子类。换句话说,"FileNotFoundException |“部分是多余的。
下面代码没问题的原因..。
} catch(FileNotFoundException e) {
...
} catch(IOException e) {
...
}...is,因为这里的IOException子句很重要:例如,如果抛出一个SocketException,它将传递by FileNotFoundException部件,并在IOException子句中捕获。
发布于 2015-05-08 06:58:49
在捕获异常时,您可以将catch子句的顺序从最特定的到最一般的。
考虑以下等级:
class MyException extends Exception {}
class MySubException extends MyException {}如果代码的一部分抛出MyException,另一部分抛出MySubException,则必须首先捕获MySubException。
catch(MySubException e){
} catch(MyException e){
}这和使用实例操作符是一样的。
如果测试MySubException的实例是否是MyException的实例,则结果将为真。
mse = new MySubException();
if(mse instanceof MyException){
println("MyException");
} else if(mse instanceof MySubException){
println("MySubException");
}这段代码永远不会打印"MySubException“。
mse = new MySubException();
if(mse instanceof MySubException){
println("MySubException");
} else if(mse instanceof MyException){
println("MyException");
}这是正确的顺序。
发布于 2015-05-08 07:19:30
这是因为FileNotFoundException扩展了IOException,正如您所说的相同层次结构,不能将它们添加到相同的catch块中。
https://stackoverflow.com/questions/30117229
复制相似问题