Java 中的 Try-with-resources 和 return 语句

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22947755/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 19:32:15  来源:igfitidea点击:

Try-with-resources and return statements in java

javareturntry-with-resources

提问by maff

I'm wondering if putting a returnstatement inside a try-with-resourcesblock prevents the resource to be automatically closed.

我想知道在try-with-resources块中放置return语句是否会阻止资源自动关闭。

try(Connection conn = ...) {
    return conn.createStatement().execute("...");
}

If I write something like this will the Connectionbe closed? In the Oracle documentation it is stated that:

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

The try-with-resources statement ensures that each resource is closed at the end of the statement.

try-with-resources 语句确保每个资源在语句结束时关闭。

What happens if the end of the statement is never reached because of a return statement?

如果由于 return 语句而从未到达语句的末尾会发生什么?

采纳答案by merlin2011

Based on Oracle's tutorial, "[the resource] will be closed regardless of whether the try statement completes normally or abruptly". It defines abruptlyas from an exception.

根据Oracle 的教程,“无论 try 语句是正常完成还是突然完成,[资源] 都将关闭”。它定义abruptly为来自异常。

Returning inside the tryis an example of abrupt completion, as defined by JLS 14.1.

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

回答by Nurettin Armutcu

The resource will be closed automatically (even with a returnstatement) since it implements the AutoCloseableinterface. Here is an example which outputs "closed successfully":

资源将自动关闭(即使使用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");
    }
}