假设我有一个有两个OutputStream成员的类:
public class A {
OutputStream os1 = ...
OutputStream os2 = ...
...
}
现在,在这个课程中,我有一个cleanup()
方法,它必须至少尝试关闭两个流:
public void cleanup() throws IOException {
try {
os1.close();
} finally {
os2.close();
}
}
现在,我确信上面的代码会尝试关闭两个流,但有趣的是,当两个调用close()
抛出IOException时会发生什么。我想说os2的异常会向上传播,但也许这种行为是未定义的。我做了一些谷歌搜索,但我没有找到任何能够很好地回答这个问题的东西。
答案 0 :(得分:2)
如果finally抛出异常,则该方法以该异常终止。它的定义很明确。同样,如果finally返回,则该方法返回finally' s返回值,无论先前从关联的try块返回任何内容。
答案 1 :(得分:2)
JLS §14.20.2描述了这种行为。
该方法抛出的异常是由os2.close()
引起的异常。
答案 2 :(得分:0)
是的,第二个异常向上传播,第一个异常丢失。
但如果您使用的是Java 7或更高版本,那么使用"尝试使用资源"会更好。句法。代码很多更干净,编写起来要少得多,并且它可以做得更好,确保资源在应用时关闭,无论如何什么。例如,无论你制作cleanup()
多么聪明和花哨,如果它没有被调用,那么你就没有运气了。如果应该调用它的上下文本身会引发异常怎么办?不要这样做!