正确使用try-catch和资源

时间:2015-02-12 08:42:32

标签: java

Java 1.7 try-catch with resources ,它自己处理 closeable 资源。意味着,当执行try-catch块时,资源会自动关闭。

我对try-catch块的结束感到困惑。考虑以下两种情况。

案例1:

void function()
{
    try (closable)
    {
        doSomething();
    }
    catch (Exception)
    {}

    //at this point, the closable variable is closed
    //by try-catch statement. No issues and it's clear.
}

案例2:

void function()
{
    try (closable)
    {
        doSomething();
        return;
    }
    catch (Exception)
    {}

    //we never reached to this point, and this what 
    //makes me think.Is closable really closed before 
    //return statement or do we need to manually call 
    //closable.close() before returning?
}

感谢。

5 个答案:

答案 0 :(得分:1)

是的,它已关闭。

此:

try(Resource r = new Resource()) {
    // do stuff
}

的工作方式几乎与此相同:(如果close抛出异常,它的行为会有所不同)

Resource r = new Resource();
try {
    // do stuff
} finally {
    r.close();
}
如果从finally块的中间返回,则执行

try块,或者通过到达结尾离开它,或者从其中抛出异常,或者跳出它breakcontinue

答案 1 :(得分:1)

  

在return语句之前闭包是否真的关闭了还是我们需要在返回之前手动调用closable.close()?

是的,它会自动为您打电话。

要自己验证这一点,您可以在closeable对象的close()方法中放置一个断点,然后以debug模式运行您的应用程序。在return;执行之后,您应该看到JVM在close()方法中停止执行。

答案 2 :(得分:1)

您可以使用finally块进行确认,最后块将始终执行,因此您可以在finally块进行双重检查: -

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

finaly
{
if(!r.closed)
r.close();
}

注意: - 最终不适用于以下方案How to avoid a scenario in which finally block does not execute

答案 3 :(得分:0)

尝试使用资源与使用JDK 7之前的finally块相同。

finally {
        if (resource != null) resource.close();
    }

所以答案是:在离开try / catch / finally块后资源是clodes。

答案 4 :(得分:0)

在第二个示例中,您永远不会到达try-catch块之后的点,因为您从方法返回。关闭将关闭。

  

void close()              抛出异常

     

关闭此资源,放弃任何底层资源。这个   方法在由...管理的对象上自动调用   尝试使用资源声明。

     

虽然声明此接口方法抛出异常,   强烈鼓励实施者宣布具体内容   close方法的实现抛出更具体的异常,   如果关闭操作不能失败,则根本不抛出任何异常。

     

强烈建议不要使用此接口的实施者   close方法抛出InterruptedException。此异常进行交互   线程处于中断状态,可能存在运行时错误行为   在禁止InterruptedException时发生。更一般地说,如果   它会导致异常被抑制的问题,   AutoCloseable.close方法不应该抛出它。

     

请注意,与Closeable的close方法不同,此close方法是   不要求是幂等的。换句话说,称之为接近   方法不止一次可能有一些可见的副作用,不像   Closeable.close,如果调用更多,则无效   不止一次。但是,这个界面的实施者是强烈的   鼓励他们的近似方法是幂等的。

     

抛出:       例外 - 如果此资源无法关闭

Source