on oracle ofiicial site write(http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow
)
详细说明,在Java SE 7及更高版本中,当您声明一个或多个时 catch子句中的异常类型,并重新抛出处理的异常 通过此catch块,编译器验证重新生成的异常的类型满足以下条件:
- try块能够抛出它。
- 没有其他前面的catch块可以处理它。
- 它是catch子句的一个异常参数的子类型或超类型。
请专注于第二点(There are no other preceding catch blocks that can handle it
。)
研究以下代码:
static private void foo() throws FileNotFoundException {
try {
throw new FileNotFoundException();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
throw e;
}
}
此代码编译良好。根据我的意见,在阅读上述文章的引用之后,我希望看到编译器将对其进行验证,我将收到编译器错误。
我理解第二点错了吗?
答案 0 :(得分:1)
这是完全正常的,因为FileNotFoundException
来自IOException
,并且因为你从较不具体到更具体,所以不应该有任何问题。
编辑:
static private void foo() throws FileNotFoundException {
try {
throw new FileNotFoundException();
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
throw e;
}
}
答案 1 :(得分:0)
throw e;
行,实际上没有其他可以处理它的前面的catch块。确实IOException可能是FileNotFoundException,但不是在这种特殊情况下。如果是的话,第一次捕获它就会被捕获。