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?
}
感谢。
答案 0 :(得分:1)
是的,它已关闭。
此:
try(Resource r = new Resource()) {
// do stuff
}
的工作方式几乎与此相同:(如果close
抛出异常,它的行为会有所不同)
Resource r = new Resource();
try {
// do stuff
} finally {
r.close();
}
如果从finally
块的中间返回,则执行和try
块,或者通过到达结尾离开它,或者从其中抛出异常,或者跳出它break
或continue
。
答案 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,如果调用更多,则无效 不止一次。但是,这个界面的实施者是强烈的 鼓励他们的近似方法是幂等的。
抛出: 例外 - 如果此资源无法关闭