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

Posted

技术标签:

【中文标题】文件处理的资源泄漏,尝试使用资源 VS try-catch-finally 使用 file.close() [重复]【英文标题】:Resource leak for file processing, try with resources VS try-catch-finally with file.close() [duplicate] 【发布时间】:2016-04-18 18:50:15 【问题描述】:

当谈到文件处理和资源泄漏时,

这两种处理问题的方式有什么优缺点:

尝试使用资源 VS Try/catch/finally 使用 file.close?

谢谢

【问题讨论】:

【参考方案1】:

最大的区别是使用 try-finally 方法屏蔽异常的危险。如果您在关闭时不小心捕捉到 finally 块中抛出的任何内容,则可以屏蔽 try 块中抛出的任何异常。这意味着如果 try 块中的代码抛出异常,那么 finally 中的代码会抛出异常,传播的异常是 finally 块中的异常(通常不是您希望看到的异常)。

try-with-resources 消除了异常屏蔽的危险,它确保如果从 try 块中抛出异常,则 close 方法抛出的任何异常都会被添加为抑制异常。

try-with-resources 处理 try 块中没有抛出异常但关闭时抛出异常的情况与使用 try-finally 并捕获 finally 块中抛出的任何内容时的处理方式不同。使用 try-with-resources 将抛出关闭时抛出的异常(因为没有将其作为抑制异常添加到的异常),其中 try-finally 的常用方法是吃掉或记录从 finally 方法抛出的任何异常.因此,如果您不希望关闭失败导致引发异常,从而破坏一些原本可以正常工作的逻辑,您可能希望避免为此使用 try-with-resources。

一个显着的区别是 try-with-resources 如何允许多个资源。编写 try-finally 块的人通常对嵌套 try 块感到不耐烦,并使用快捷方式导致错误,例如在 finally 块中放置太多 close 语句(因此,如果一个语句失败,其余语句将不会执行,从而导致资源泄漏)。 try-with-resources 保证在退出时以正确的顺序关闭资源,因此不需要嵌套块。

【讨论】:

我总是尽可能地尝试使用try-with-resources,但是我讨厌当我需要使用catch块中的资源并且它已经关闭时,因为执行顺序的变化关闭()。从来不理解这个设计。现在,通过阅读这个答案,我知道 try-with-resources-catch 从来都不是等同于 try-catch-finally,而是解决其他问题并防止错误。【参考方案2】:

我的理解是这样的

try(InputStream is = new InputStream(...))
    ...

在功能上等同于:

InputStream is=null;
try
    is = new InputStream(...);
    ...
finally
    try
        is.close();
    catch(Exception e)

【讨论】:

这介于过度简化和不正确之间。 close() 抛出的异常不会被忽略。 try-with-resources 的翻译指定为here。

以上是关于文件处理的资源泄漏,尝试使用资源 VS try-catch-finally 使用 file.close() [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何定位和解决Android的内存溢出问题(大总

Jar包内调用包内资源文件

使用 try 时资源泄漏...最后?

vs将dll添加到rc资源

由于包含路径,cppcheck 未检测到资源泄漏

Klocwork Inside 的资源泄漏