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

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

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

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

谢谢

【问题讨论】:

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


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 2021-11-26
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多