web-dev-qa-db-ja.com

java

returnステートメントをtry-with-resourcesブロック内に置くと、リソースが自動的に閉じられるのではないかと思います。

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

このようなものを書くと、接続は閉じられますか? Oracleのドキュメントでは、次のように述べられています。

Try-with-resourcesステートメントは、ステートメントの終わりに各リソースが確実に閉じられるようにします。

Returnステートメントのためにステートメントの最後に到達しない場合はどうなりますか?

40
maff

Oracleのチュートリアル に基づいて、「[ステートメント]は、tryステートメントが正常に完了するか突然完了するかに関係なく閉じられます」。例外としてabruptlyを定義しています。

JLS 14.1 で定義されているように、tryの内部での戻りは、突然の完了の例です。

52
merlin2011

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");
    }
}
12