Java'终于'异常投掷规则

时间:2014-05-23 23:58:50

标签: java exception try-catch-finally

假设我有一个有两个OutputStream成员的类:

public class A {
    OutputStream os1 = ...
    OutputStream os2 = ...

    ...
}

现在,在这个课程中,我有一个cleanup()方法,它必须至少尝试关闭两个流:

public void cleanup() throws IOException {
    try {
        os1.close();
    } finally {
        os2.close();
    }
}

现在,我确信上面的代码会尝试关闭两个流,但有趣的是,当两个调用close()抛出IOException时会发生什么。我想说os2的异常会向上传播,但也许这种行为是未定义的。我做了一些谷歌搜索,但我没有找到任何能够很好地回答这个问题的东西。

3 个答案:

答案 0 :(得分:2)

如果finally抛出异常,则该方法以该异常终止。它的定义很明确。同样,如果finally返回,则该方法返回finally' s返回值,无论先前从关联的try块返回任何内容。

答案 1 :(得分:2)

JLS §14.20.2描述了这种行为。 该方法抛出的异常是由os2.close()引起的异常。

答案 2 :(得分:0)

是的,第二个异常向上传播,第一个异常丢失。

但如果您使用的是Java 7或更高版本,那么使用"尝试使用资源"会更好。句法。代码很多更干净,编写起来要少得多,并且它可以做得更好,确保资源在应用时关闭,无论如何什么。例如,无论你制作cleanup()多么聪明和花哨,如果它没有被调用,那么你就没有运气了。如果应该调用它的上下文本身会引发异常怎么办?不要这样做!