Eclipse reclama por variável não inicializada

6 respostas
R

Nesse código, o eclipse me obrigou a colocar o “=null” na declaração de tesoura e portico. Por que isso acontece? Não é a mesma coisa de não criar o objeto? No final do código eu tenho um if verificando se são null ou não.

@Override protected void acaoSalvar() { Tesoura tesoura = null; Portico portico = null; if (pecaEstrutural == null){ if (visaoPecaEstrutural.getTipo().equals(TelaEdicaoPecaEstrutural.PORTICO)){ portico = new Portico(); pecaEstrutural = portico; }else if (visaoPecaEstrutural.getTipo().equals(TelaEdicaoPecaEstrutural.TESOURA)){ tesoura = new Tesoura(); pecaEstrutural = tesoura; } } pecaEstrutural.setDescricao(visaoPecaEstrutural.getDescricao()); Integer qtdCharutos = ConversoesUtil.stringToInteger(visaoPecaEstrutural.getQtdCharutos()); if (qtdCharutos != null){ pecaEstrutural.setQuantidadeCharutos(qtdCharutos); } if (tesoura != null) session.saveOrUpdate(tesoura); else session.saveOrUpdate(portico); visao.setLinhas(pecaEstrutural.getItens()); }

6 Respostas

Mauricio_Linhares

Porque para o analizador léxico do Eclipse você pode estar tentando usar variáveis que ainda não foram instanciadas (veja o seu if sem else).

danieldestro

Mesmo assim “não tem a ver” com o Eclipse, mas sim com a linguagem Java em sí. O compilador reclamaria pelo mesmo motivo.

R

Já fiz o else e mesmo assim reclama.

protected void acaoSalvar() { Tesoura tesoura = null; Portico portico = null; if (pecaEstrutural == null){ if (visaoPecaEstrutural.getTipo().equals(TelaEdicaoPecaEstrutural.PORTICO)){ portico = new Portico(); pecaEstrutural = portico; }else if (visaoPecaEstrutural.getTipo().equals(TelaEdicaoPecaEstrutural.TESOURA)){ tesoura = new Tesoura(); pecaEstrutural = tesoura; } }else if (pecaEstrutural instanceof Portico) portico = (Portico)pecaEstrutural; else tesoura = (Tesoura)pecaEstrutural; pecaEstrutural.setDescricao(visaoPecaEstrutural.getDescricao()); Integer qtdCharutos = ConversoesUtil.stringToInteger(visaoPecaEstrutural.getQtdCharutos()); if (qtdCharutos != null){ pecaEstrutural.setQuantidadeCharutos(qtdCharutos); } if (tesoura != null) session.saveOrUpdate(tesoura); else session.saveOrUpdate(portico); visao.setLinhas(pecaEstrutural.getItens()); }

R

Mas por que iniciar com “=null” ? Isso não muda nada. Se antes ia acessar null, fazendo isso dá na mesma.

T

Aham.

Quando você declara um membro de uma classe, ele é automaticamente inicializado com null, ou 0.
Quando você declara uma variável local, ela não é automaticamente inicializada com nada. Essa é uma diferença importante.
O problema é que, olhando pelo fluxo de seu programa, existe uma alternativa (pecaEstrutural instanceof Portico) onde “tesoura” não recebe valor nenhum. E depois dos ifs existe um logar onde se lê o valor de tesoura: if (tesoura != null)
Provavelmente você deveria ter feito o seguinte: ter setado tesoura = null no if (pecaEstrutural instanceof Portico).
Há duas opiniões contrastantes:

  • Uma delas diz que temos sempre de inicializar todas as variáveis locais com um valor conhecido, tal como null. Isso realmente “abafa” algum warning ou mensagem de erro do compilador.
  • A outra diz que devemos inicializar o mínimo possível, e ver se ocorre a mensagem de erro de que a “variável não está inicializada”. Essa opinião diz que o compilador pode ajudar-nos a encontrar erros de lógica, porque provavelmente não é que a variável não está inicializada - senão o default do Java seria inicializar tudo sempre - , mas sim que a lógica está incompleta em algum ponto, e esse erro na verdade é um aviso para você completar a sua lógica.
R

Realmente vou ter que deixar o =null.
Na minha lógica, ou tesoura ou portico vai ter que ficar obrigatoriamente setado com null.

Criado 27 de maio de 2005
Ultima resposta 27 de mai. de 2005
Respostas 6
Participantes 4