3
respostas

try-catch with resources não chamou o finally implicito

Implementei o try-catch with resources para conexão com banco de dados e coloquei uma exceção logo no construtor da conexão, e no try-catch with resources não chamou o método close do objeto. Por que? Não deveria aparecer a linha "fechando conexão". Segue abaixo o código fonte:

// Chasse que implementa a conexão "fake"

public class ConexaoAutocloseable implements AutoCloseable{

public ConexaoAutocloseable() {
    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");

}

}

// Classe MAIN:

public class TestaConexaoTryWithResources {

public static void main(String[] args) {

    try (ConexaoAutocloseable con = new ConexaoAutocloseable()){
        con.leDados();
    } catch(IllegalStateException ex){
        ex.printStackTrace();
    }

}

}

3 respostas

Oi Thiago

O problema é que o seu construtor é quem está lançando a exception, ou seja, o objeto nem está sendo construido, está dando erro antes: na própria construção. Se você remover a exceptions que o construtor lança vai funcionar como você espera.

Abraço!

Olá Otávio, boa tarde. Sim, entendo. Fiz um teste antes de postar a dúvida e vi que realmente funcionava o try-"finally", porém eu havia entendido na aula que esse cenário de erro na construção do objeto também estaria coberto pelo finally, no entanto se fosse um objeto real de conexão com o banco daria erro e não iria fechar a conexão. Sendo assim acho melhor implementar o código da forma antiga mesmo sem usar o try-catch with resources da versão 7 do java. Segue abaixo a versão padrão que era usada antes do try-catch with resources:

public class TestaConexao {

public static void main(String[] args) {

    Conexao con = null;
    try {
        con = new Conexao();
        con.leDados();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (con != null) {
            con.fecha();
        }
    }
}

}

Se uma exceção for lançada de dentro de um bloco try-with-resources, qualquer recurso aberto dentro dos parênteses do bloco try será fechado automaticamente. Porém, nada ainda foi aberto, pois a construção do objeto deu erro, ou seja, nem chegou a criar o objeto.

Basicamente o close não será chamado pois não faria sentido chamá-lo, já que não há um objeto totalmente construído para fechar.