1

在甲骨文官方网站上写(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;
        }
    }

这段代码编译得很好。根据我在阅读上述文章的引用后的看法,我希望看到编译器会验证它,我会得到编译器错误。

我是否理解错了第二点?

4

2 回答 2

1

这非常好,因为FileNotFoundException源自IOException,并且因为您从不太具体到更具体,所以不应该有任何问题。


编辑:

static private void foo() throws FileNotFoundException  {
    try {
        throw new FileNotFoundException();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        throw e;
    }
}
于 2014-09-02T14:06:20.793 回答
0

throw e;行实际上没有其他前面的 catch 块可以处理它。确实,IOException 可能是 FileNotFoundException,但在这种特殊情况下不是。如果是这样,它就会被第一次捕获。

于 2014-09-04T15:51:44.437 回答