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

Método fecha e null

Fala, pessoal, não entendi bem por que o método fecha funcionou após declarar a variável null, antes do try, afinal, o objeto só é instanciado dentro do try. Se foi lançada uma exception no processo, a variável não permaneceria com o valor null? Por que, então, não funcionou com a inicialização da variável dentro do try?

4 respostas

Olá Giovani, tudo bem com você?

A exceção ocorre depois que iniciamos a conexão:

public static void main(String[] args) {
    Conexao con = null;
    try {
        con = new Conexao(); -> instancia da Conexao
        con.leDados(); -> Excecao
    } catch(IllegalStateException ex) {
        System.out.println("Deu erro na conexao");
    } finally {
        con.fecha();
    }
}

Ou seja, quando a exceção ocorre, a conexão já foi atribuída à variável con. E é por isso que no bloco finally nós temos acesso ao método fecha()!

Não sei se ficou claro, mas qualquer coisa é só avisar! Forte abraço e bons estudos!!

Opa, Thiago, tudo bem?

Certo, entendi, havia esquecido que a exceção ocorre no método leDados.

Só não ficou bem claro o motivo de não funcionar se inicializamos a variável dentro do try, em vez de antes.

solução!

Opa Giovani, isso se deve ao escopo da variável con.

A existência de uma variável é limitada pelo seu escopo indicado pelas chaves { }. Então, observando o código:

public static void main(String[] args) {
    Conexao con = null;
    try {
        con = new Conexao(); -> instancia da Conexao
        con.leDados(); -> Excecao
    } catch(IllegalStateException ex) {
        System.out.println("Deu erro na conexao");
    } finally {
        con.fecha();
    }
} -> fim da vida util da variavel con

Como con foi declarado no bloco do método main(), a "vida útil" dessa variável vai se estender até fechar as chaves do main() no final do programa, podendo ser acessado por qualquer um que esteja dentro desse escopo (entre as chaves do main()).

Já no caso da declaração do con dentro do bloco try:

public static void main(String[] args) {
    // Conexao con = null;
    try {
        Conexao con = new Conexao(); -> instancia da Conexao
        con.leDados(); -> Excecao

    } -> fim da vida util da variavel con

    catch(IllegalStateException ex) {
        System.out.println("Deu erro na conexao");
    } finally {
        con.fecha(); -> con nao existe mais nesse ponto
    }
}

O escopo de con estará limitado até o fechamento das chaves do try.

Bom, acho que é isso. Se ficou alguma dúvida estou à disposição!!

Boa, agora entendi, obrigadão pela ajuda!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software