首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中尝试使用资源并返回语句

在java中尝试使用资源并返回语句
EN

Stack Overflow用户
提问于 2014-04-08 20:42:50
回答 4查看 21.2K关注 0票数 65

我想知道,如果将返回语句放入一个try-with块中,是否会阻止资源被自动关闭。

代码语言:javascript
复制
try(Connection conn = ...) {
    return conn.createStatement().execute("...");
}

如果我写这样的东西,连接会被关闭吗?Oracle文档中指出:

try-语句确保在语句末尾关闭每个资源。

如果由于返回语句而无法到达语句的结尾,会发生什么情况?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-08 20:51:16

基于Oracle's tutorial,“不管try语句是否正常或突然完成,资源都将关闭”。它将abruptly定义为异常。

try内部返回是一个JLS 14.1定义的突然完成的例子。

票数 76
EN

Stack Overflow用户

发布于 2017-08-17 13:53:52

资源将自动关闭(即使使用return语句),因为它实现了AutoCloseable接口。以下是输出“成功关闭”的示例:

代码语言:javascript
复制
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");
    }
}
票数 24
EN

Stack Overflow用户

发布于 2020-11-19 14:28:39

AutoCloseable接口可以使代码的执行顺序乍一看容易混淆。让我们用一个例子来讨论这个问题:

代码语言:javascript
复制
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并使用资源执行一些业务逻辑(在本例中只是一些算法)。运行代码将打印:

代码语言:javascript
复制
open
close
4

因此,在退出使用资源的尝试块之前,Resource是关闭的。为了弄清楚到底发生了什么,让我们重新组织findNumber()方法。

代码语言:javascript
复制
    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关闭之前返回。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22947755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档