4
respostas

Dúvida no fechamento de conexão

Como faço para usar o con.fecha(); para fechar a conexão? O problema é o seguinte:

O professor simulou uma abertura e fechamento de conexões com Conexao() e fecha() usando o try catch e finally. Porém:

  • Se eu uso o con.fecha dentro do try, o System.out.println("Fechando conexao") não aparece no console, e se eu uso embaixo, no finally, dá um erro *"con cannot be resolved."

O que devo fazer para conseguir fechar a conexão?

Consegui contornar fazendo uma outra instancia Conexao con2 = new Conexao(); e usar essa instância embaixo, no finally, mas não sei se é uma má prática fazer isso.

Obrigado!


public class Conexao implements AutoCloseable {

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

    public void leDados() {
        System.out.println("Recebendo dados");

    }

    public void fecha() {
        System.out.println("Fechando conexao");
    }

    @Override
    public void close() throws Exception {

    }
}

------------------------------------------------------------------------


public class TesteConexao {

    public static void main(String[] args) {

        Conexao conexao = null;

        try(Conexao con = new Conexao() ) {
            con.leDados();
            con.fecha();
        } catch(Exception ex) {
            System.out.println("Exception pega");
        }

    }

}
4 respostas

Olá Thomas!

Realmente é uma boa prática você colocar o fechamento da conexão no finally.

Ficaria algo como:

try(Conexao conexao = new Conexao() ){
    conexao.leDados();
} catch(IllegalStateException ex){
    System.out.println("Deu erro na conexão");
} finally{
    conexao.fecha();
}

Espero que tenha ajudado! ^^

Então, o problema é que isso não compila! Aparece o erro conexao cannot be resolved

Entendi, e dessa forma:

Conexao conexao = new Conexao() 
try{
    conexao.leDados();
} catch(IllegalStateException ex){
    System.out.println("Deu erro na conexão");
} finally{
    conexao.fecha();
}

Funciona?

Quando eu tento isso, aparece o seguinte erro no console:

Abrindo conexao

Exception in thread "main" java.lang.IllegalStateException

at Conexao.(Conexao.java:6)

at TesteConexao.main(TesteConexao.java:7)

Creio que acontece esse erro porque o throw new IllegalStateException(); tá no construtor public Conexao(), então o erro acontece antes mesmo de chegar no catch.

Mas, o que eu tô tentando fazer é executar o fecha() com o Conexao con = new Conexao() no try propositalmente.

Por exemplo, eu sei que se eu tirar o exception do construtor public Conexao() e instanciar um Conexao con = new Conexao(); fora do try, compila sem problemas. Mas o desafio é fechar a conexão dentro do Try Catch Finally mesmo.

Desculpe por não ser claro :P