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());
}
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
ronaldorezende
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
ronaldorezende
Mas por que iniciar com “=null” ? Isso não muda nada. Se antes ia acessar null, fazendo isso dá na mesma.
T
thingol
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
ronaldorezende
Realmente vou ter que deixar o =null.
Na minha lógica, ou tesoura ou portico vai ter que ficar obrigatoriamente setado com null.