如何捕获try-with-resource语句中close方法抛出的异常

时间:2015-09-24 03:58:36

标签: java exception try-catch

我正在阅读Java中的try-with-resource语句,该语句可用于指定任意数量的资源。

try (Resource1 res1 = initialize_code; Resource1 res2 = initialize_code; ...) 
{
    statement;
}

现在,当try块退出时(通常或异常抛出异常),将调用所有资源对象的close方法。但是一些close方法可能会抛出异常。如果close本身抛出异常会在该场景中发生什么?

1 个答案:

答案 0 :(得分:3)

  

但是一些接近的方法可能会抛出异常。

是的,他们可以,你是对的。资源也按其初始化的相反顺序关闭。

  

如果close方法本身抛出异常,会发生什么?

正如您所提到的,一些close方法也可以抛出异常。如果在正常执行try块时发生这种情况,则会向调用者抛出异常。

但是什么时候抛出了另一个异常,导致close 要调用的资源的方法,其中一个close方法抛出一个异常(实际上重要性较低的例外)?

在这种情况下,原始异常会被重新抛出,并由close方法引起异常 也被supressed exception捕获并附加。这实际上是使用try-with-resource的一个优势因为实现这样的机制将是繁琐的手工实现。

try {
 ///statements.
} catch (IOException e) { 
   Throwable[] supressedExceptions = ex.getSupressed();
}