Bug no if?

11 respostas
lcn.andre

Já é a segunda vez que isso acontece comigo.
Quando um if retorna falso… o código do bloco é executado em vez de ser ignorado.

for (int i=0; i<lista.size(); i++) { OperacaoItem item = (OperacaoItem) lista.get(i); item.getProduto().getEstoqueEmpresaProdutos().size(); for (EstoqueEmpresaProduto eep : item.getProduto().getEstoqueEmpresaProdutos()) { if (eep.isBoolGaiola()) { //esse if retorna falso (com certeza) linhasAzuis.add(i); //mesmo assim, esta linha é executada } } }

Alguém sabe se isso é um bug? Pois não vejo problema nenhum na minha lógica. Estou usando Netbeans 6.71. Grato

11 Respostas

fabiofalci

Note que o if está dentro de um laço.
Vc tem certeza que em nenhuma iteração do laço é true?

fabinhofbn

O Atributo em isBoolGaiola é false. Certeza Absoluta?
Como o fabiofalci citou, também é possivel acontecer. A melhor coisa a se fazer nesse caso é debugar, pois assim você irá ver o que existe dentro de suas listas, as vezes é erro na hora da inserção dos dados na lista, talvez a falta de um new e assim por diante. Debuga e vc vai ver que não é erro de if não.

rogelgarcia

Se existisse um erro de if no java… eu jogava tudo que eu sei fora… e ia plantar batata ehhehehe

D

Uma coisa que eu aprendi é que a chance de vc estar errado é muito superior do Java estar errado, em todas as que eu achei que o Java estivesse errado acabou que o errado era eu. Quando for assim manda imprimir o valor do que está dentro do if e coloca fora dele, aí vc vai ver o pq dele estar entrando e em qual situação.

allyssonluan

Deve ser por causa do seu For.

No comments!

galileu.gt

Se existisse um erro de if no java… eu jogava tudo que eu sei fora… e ia plantar batata ehhehehe [2]

peczenyj

Use um debugger ou use PPADD - Passei Por Aqui Driven Development - para mostrar o suposto BUG do if :wink:

public bool retornaFalse(){
  System.out.println("vou retornar false....");
}

if(retornaFalse()){
System.out.println("ah perfeito");
}else {
System.out.println("OPA! BUG NO IF MINHA GENTE!!");
}
D

CONCORDO PELNAMENTE COM VC…

coloca pra escrever o valor da operação antes desse if…

vlw

lcn.andre

O problema de sistemas grandes é que cada um faz uma coisa e às vezes alguém foge do padrão. O padrão nesse caso é que as listas são sempre do tipo List, mas alguém aqui definiu “getEstoqueEmpresaProdutos()” como Collection. O problema estava na iteração mesmo. Mudei para isto e funcionou:

for (int i=0; i<lista.size(); i++) { OperacaoItem item = (OperacaoItem) lista.get(i); Iterator<EstoqueEmpresaProduto> estoques = item.getProduto().getEstoqueEmpresaProdutos().iterator(); // Pinta de azul while (estoques.hasNext()) { EstoqueEmpresaProduto eep = estoques.next(); if (eep.isBoolGaiola() && eep.equals(item.getEstoqueEmpresaProduto())) { linhasAzuis.add(i); break; } } }

Agora a pergunta: quando eu estava fazendo o debug a iteração com smart for acontecia normalmente, os valores retornavam corretamente também. Tanto que disse que tinha certeza absoluta que estava retornando falso, mas mesmo assim quando passava do if, ele entrava no bloco. O que uma coisa tem a ver com outra?

E

WTF? Provavelmente seu problema não era o for ou o iterator (visto que um foreach é transformado pelo compilador para o Iterator que você mostrou no seu código - não importa se é um Collection ou um List). Seu problema provavelmente era o if, que carecia de uma condição:

// Código antigo - provavelmente bugado
                 if (eep.isBoolGaiola()) {
// Código corrigido
                 if (eep.isBoolGaiola() && eep.equals(item.getEstoqueEmpresaProduto())) {
ViniGodoy

Não só isso, você também inseriu um break; na correção. E isso faz toda a diferença.

for (int i=0; i<lista.size(); i++) { OperacaoItem item = (OperacaoItem) lista.get(i); item.getProduto().getEstoqueEmpresaProdutos().size(); for (EstoqueEmpresaProduto eep : item.getProduto().getEstoqueEmpresaProdutos()) { if (eep.isBoolGaiola() && eep.equals(item.getEstoqueEmpresaProduto())) { linhasAzuis.add(i); //mesmo assim, esta linha é executada break; } } }

Criado 14 de julho de 2010
Ultima resposta 14 de jul. de 2010
Respostas 11
Participantes 11