我想知道,如果将返回语句放入一个try-with块中,是否会阻止资源被自动关闭。
try(Connection conn = ...) {
return conn.createStatement().execute("...");
}如果我写这样的东西,连接会被关闭吗?Oracle文档中指出:
try-语句确保在语句末尾关闭每个资源。
如果由于返回语句而无法到达语句的结尾,会发生什么情况?
发布于 2014-04-08 20:51:16
基于Oracle's tutorial,“不管try语句是否正常或突然完成,资源都将关闭”。它将abruptly定义为异常。
在try内部返回是一个JLS 14.1定义的突然完成的例子。
发布于 2017-08-17 13:53:52
资源将自动关闭(即使使用return语句),因为它实现了AutoCloseable接口。以下是输出“成功关闭”的示例:
public class Main {
public static void main(String[] args) {
try (Foobar foobar = new Foobar()) {
return;
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Foobar implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("closed successfully");
}
}发布于 2020-11-19 14:28:39
AutoCloseable接口可以使代码的执行顺序乍一看容易混淆。让我们用一个例子来讨论这个问题:
public class Main {
// An expensive resource which requires opening / closing
private static class Resource implements AutoCloseable {
public Resource() {
System.out.println("open");
}
@Override public void close() throws Exception {
System.out.println("close");
}
}
// find me a number!
private static int findNumber() {
// open the resource
try(Resource resource = new Resource()) {
// do some business logic (usually involving the resource) and return answer
return 2 + 2;
} catch(Exception e) {
// resource encountered a problem
throw new IllegalStateException(e);
}
}
public static void main(String[] args) {
System.out.println(findNumber());
}
}上面的代码尝试打开一些Resource并使用资源执行一些业务逻辑(在本例中只是一些算法)。运行代码将打印:
open
close
4因此,在退出使用资源的尝试块之前,Resource是关闭的。为了弄清楚到底发生了什么,让我们重新组织findNumber()方法。
private static int findNumber() {
// open the resource
int number;
try(Resource resource = new Resource()) {
// do some business logic and return answer
number = 2 + 2;
} catch(Exception e) {
// resource encountered a problem
throw new IllegalStateException(e);
}
return number;
}从概念上讲,这就是当return被放置在一个带有资源的尝试块中时,在引擎盖下发生的情况。将return操作移到“使用资源的尝试”块之后,以便在返回之前关闭AutoCloseable对象。
因此,我们可以得出结论,在带资源的试用块中的return操作只是语法糖,您不必担心在AutoCloseable关闭之前返回。
https://stackoverflow.com/questions/22947755
复制相似问题