web-dev-qa-db-fra.com

Essayez avec des ressources et renvoyez des instructions dans java

Je me demande si mettre une instruction return à l'intérieur d'un bloc try-with-resources empêche la fermeture automatique de la ressource.

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

Si j'écris quelque chose comme ça, la Connexion sera-t-elle fermée? Dans la documentation Oracle, il est indiqué que:

L'instruction try-with-resources garantit que chaque ressource est fermée à la fin de l'instruction.

Que se passe-t-il si la fin de l'instruction n'est jamais atteinte à cause d'une instruction de retour?

40
maff

Basé sur tutoriel d'Oracle , "[la ressource] sera fermée, que l'instruction try se termine normalement ou brusquement". Il définit abruptly à partir d'une exception.

Le retour à l'intérieur de try est un exemple de complétion brutale, tel que défini par JLS 14.1 .

52
merlin2011

La ressource sera fermée automatiquement (même avec une instruction return) car elle implémente l'interface AutoCloseable. Voici un exemple qui sort "fermé avec succès":

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
Nurettin Armutcu