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

时间:2016-04-18 18:50:15

标签: java exception-handling file-processing try-with-resources resource-leak

涉及文件处理和资源泄漏时,

这两种处理问题的方法有哪些优点和缺点:

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

由于

2 个答案:

答案 0 :(得分:1)

最大的区别在于使用try-finally方法进行异常屏蔽的危险。如果您不小心捕获在finally块中抛出的任何内容,则可以屏蔽try块中抛出的任何异常。这意味着如果try块中的代码抛出异常,则finally中的代码抛出异常,传播的异常是finally块中的异常(通常不是您想要查看的那个)。

通过确保如果从try块抛出异常,try-with-resources消除了异常屏蔽的危险,close方法抛出的任何异常都被视为一个被抑制的异常。

如果你使用try-finally并捕获finally块中抛出的任何内容,try-with-resources会以不同的方式处理try块中抛出异常但抛出异常的情况。使用try-with-resources会抛出close上抛出的异常(因为没有异常将其添加为抑制异常),其中try-finally的常用方法是吃掉或记录finally方法抛出的任何异常。因此,如果你不想在关闭时失败导致抛出异常,破坏一些正常工作的逻辑,你可能想避免尝试使用资源。

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

答案 1 :(得分:-1)

我的理解是

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

在功能上等同于:

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