在甲骨文官方网站上写(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;
}
}
这段代码编译得很好。根据我在阅读上述文章的引用后的看法,我希望看到编译器会验证它,我会得到编译器错误。
我是否理解错了第二点?