Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Metodo close

Quando colocamos o throw no construtor, ou seja, para dar erro ao abrir a conexão, o método close também não deveria ser chamado automaticamente, fechando a conexão? Da mesma forma como aconteceu ao jogar o throw no método leDados?

..com o throw no construtor, a minha saída é a seguinte: - Abrindo conexão - Erro na conexão

3 respostas

Hiroshi, coloque o código aqui para que eu possa analisar, por gentileza.

Segue as duas classes:

Se vc comentar o throw do construtor, verá que o código roda conforme esperado (roda o construtor, dá erro no metodo leDados e chama automaticamente o metodo close - AutoCloseable)

Porem, se vc deixar rodar o throw do construtor, verá que ele não chama o close. Por que essa diferença?

public class Conexao implements AutoCloseable {

    public Conexao() {
        System.out.println("Abrindo Conexão");
        throw new IllegalStateException();

    }

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

    @Override
    public void close() {
        System.out.println("Fechando conexão");

    }
}
public class TesteConexao {

    public static void main(String[] args) {

        try (Conexao con = new Conexao ()){
            con.leDados();
        }catch (IllegalStateException ex) {
            System.out.println("-> Deu ruim!");
        }

    }

}
solução!

Boa tarde Hiroshi,

O que ocorre é que com o throw new IllegalStateException(); dentro do método Conexao o objeto que seria passado para o try não foi completamente construído, é como se a conexão nem tivesse sido aberta.

Foi mostrada a mensagem Abrindo Conexão mas antes do objeto ser criado lançamos uma excessão na pilha, dessa maneira o método close não é chamado.

Agora se comentarmos o throw no método Conexao o objeto passado para o try será devidamente criado e o erro ocorrerá somente no método leDados. Nesse caso o close será chamado.

public Conexao() {
        System.out.println("Abrindo Conexão");
        //throw new IllegalStateException();
    }
Abrindo conexao
Recebendo dados
Fechando conexao
Deu erro na conexão

No caso acima o erro ocorreu após a passagem do objeto (representando que a conexão foi aberta), dessa maneira se um erro ocorrer o método close será automaticamente chamado.

No final do vídeo o professor dá um exemplo do erro no método Conexao.

Abraços