1
resposta

O medo close() nāo é chamado quando a exceçāo é jogada no construtor?? Porque?

public class Conexao implements AutoCloseable {

    public Conexao() {
        System.out.println("Abrindo conexao");
        throw new IllegalStateException();
    }

    public void leDados() {
        System.out.println("Recebendo dados");
        // throw new IllegalStateException();
    }

    @Override
    public void close() {
        System.out.println("Fechando conexao");
    }
}

Quando executo com o try with resources, o meted close() nah eh chamado!! Gostaria de saber porque e se isso eh tratado usualmente na classe de conexão.

public class TestaConexao {

    public static void main(String[] args) {

        try (Conexao conexao = new Conexao()) {
            conexao.leDados();
        } catch (IllegalStateException ex) {
            System.out.println("Deu algum pau na conexao!!");
        }
    }
}
1 resposta

Quando usa-se o try with resources você precisa que a classe que você esteja usando tenha implementado a interface AutoCloseable.

The try-with-resources statement ensures that each resource is closed at the end of the statement. Any object that implements java.lang.AutoCloseable, which includes all objects which implement java.io.Closeable, can be used as a resource.

https://docs.oracle.com/javase/10/docs/api/java/lang/AutoCloseable.html

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html