尝试使用资源:关闭 TWR 块中的资源时资源泄漏

Posted

技术标签:

【中文标题】尝试使用资源:关闭 TWR 块中的资源时资源泄漏【英文标题】:Try with Resources: Resource leak while closing resources in TWR block 【发布时间】:2015-01-25 10:34:10 【问题描述】:

我读到我们不需要显式关闭资源,它将由 java 本身关闭,假设我编写了代码。

try(FileInputStream fis = new FileInputStream("");)
  // code to to somethings

FileInputStream 将被自动关闭,如果在关闭时产生错误,它将抑制该表达式。

那么如果在关闭一个FileInputStream的时候抛出了异常,由于异常会被抑制,所以资源没有关闭,会不会产生资源泄漏?

【问题讨论】:

请注意,如果从 try 块中抛出异常,它只会抑制异常。通过在抛出的异常上调用 getSuppressed() 仍然可以使用被抑制的异常。 见***.com/questions/26459988/… 【参考方案1】:

所以如果在关闭FileInputStream时产生expression异常,由于expression异常会被抑制,资源不会被关闭...

你不知道它没有关闭,只是你在关闭它时遇到了异常。

...会不会造成资源泄露?

它可能会或可能不会造成泄漏,但您无能为力。如果您尝试关闭该资源,那么您已经完成了您的工作。

但JB Nizet makes a very important point:只有如果try 块内(或在附加的finally 块内)引发了其他异常,该异常才会被抑制。如果try(或finally)期间没有异常,则关闭资源的异常不会被抑制。

【讨论】:

以上是关于尝试使用资源:关闭 TWR 块中的资源时资源泄漏的主要内容,如果未能解决你的问题,请参考以下文章

java 7新特性-TWR(Try-with-resources)

Java 7 使用TWR(Try-with-resources)完成文件copy

高效 告别996,开启java高效编程之门 4-5TWR进阶与特殊情况

高效 告别996,开启java高效编程之门 4-5TWR进阶与特殊情况

资源泄漏:'in' 永远不会关闭

文件处理的资源泄漏,尝试使用资源 VS try-catch-finally 使用 file.close() [重复]