文件处理的资源泄漏,尝试使用资源 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() [重复]的主要内容,如果未能解决你的问题,请参考以下文章