在前面的catch块中处理的重新抛出异常

时间:2014-09-02 14:01:36

标签: java exception-handling try-catch java-7 rethrow

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;
        }
    }

此代码编译良好。根据我的意见,在阅读上述文章的引用之后,我希望看到编译器将对其进行验证,我将收到编译器错误。

我理解第二点错了吗?

2 个答案:

答案 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,但不是在这种特殊情况下。如果是的话,第一次捕获它就会被捕获。