[Resolvido] Comparação NULL com NULL

22 respostas
augustovieira

Olá pessoal, estou com uma situação que está me quebrando a cabeça aqui. Tenho o seguinte método:

public void mostrarSimNao(){
		if (atividadeContemAcaoList==null){
			habilitaSimNao = true;
		}else{
			habilitaSimNao = false;
		}
	}

Bom… Pelos meus ensinamentos em Banco de dados, null == null é false mas em java null == null é true! Na minha condição IF tenho: if (atividadeContemAcaoList==null){. O atividadeContemAcaoList vem como nulo e se comparar com null isso retorna FALSE! Bom o que preciso é de algum jeito que se comparar o valor null == null retorne true e não false como está fazendo. Alguém pode me ajudar?

22 Respostas

rmendes08

Debuga direitinho que você vai descobrir que o atividadeContemAcaoList não está null, caso contrário, sua JVM está com bug.
Outra dica, fica muito melhor escrever esse código da seguinte maneira:

public void mostrarSimNao(){
   habilitaSimNao = (atividadeContemAcaoList == null);
}
lucasportela

O atividadeContemAcaoList vem como nulo ou vazio? Mostra o trecho que chama esse método para ficar mais claro.

mateuscs

Bom dia

augustovieira,

Pelo jeito que postou, esta correta a comparação.
A não ser que vc esteja instanciando o objeto atividadeContemAcaoList.
Por exemplo, se você definiu Object atividade = new Object(), ele não é mais nulo e sim vazio.

G

em DB
null == null é false?

no caso do DB, null não é nem =, nem <> d qq coisa.
null só é null.

augustovieira

Meu atividadeContemAcaoList está vindo como NULL, e se eu debugar essa comparação está como FALSE e não cai dentro do meu IF como eu queria que caisse!

mateuscs

augusto,

Poste seu codigo inteiro.
Creio que você está instanciando essa variavel em algum lugar.

lucasportela

GilsonNunes:
em DB
null == null é false?

no caso do DB, null não é nem =, nem <> d qq coisa.
null só é null.

Aproveitando o comentário…

null nem pode ser comparado com esses operadores no Oracle. Geralmente é ‘where x is null’. Outro detalhe que o null pode ser uma dor de cabeça em chaves únicas, com o null a chave única não é única, pois aceita vários null.

augustovieira

A idéia é o seguinte. No meu xhtml tenho 2 combos! um combo1 só será habilitado se o outro combo2 for selecionado, caso meu combo2 estiver na opção “selecione” o combo1 não será habilitado. Para isso criei esse método! está funcionando certinho porém na hora da comparação quando faço NULL com NULL ele retorna false. Ele está vindo com o valor certinho quando seleciono outra opção no combo2 mas quando seleciono novamente o “selecione”, ele compara null com null é false!

augustovieira

Assim, aqui tenho meu combo que será desabilitado

<td align="right"><h:outputText value="#{props.data_que_contem_repasse}"/></td>
					<td style="height:18px;"><rich:calendar id="dataInicialContemAcao" value="#{pwkf015.periodoInicialContemAcao}" datePattern="#{localizer.datePattern}" enableManualInput="true" inputSize="8" disabled="#{controller.habilitaSimNao}"/></td>
					<td><h:outputText value=" #{props.ate} "/></td>
					<td><rich:calendar id="dataFinalContemAcao" value="#{pwkf015.periodoFinalContemAcao}" datePattern="#{localizer.datePattern}" enableManualInput="true" inputSize="8" disabled="#{controller.habilitaSimNao}"/></td>

E aqui tenho o combo que caso ele for “selecione”, os campos do código acima serão desabilitados.

<td><h:panelGroup id="comboContemAcaoPwkf015">
								<a4j:repeat value="#{pwkf015.atividadeContemAcaoList}" rowKeyVar="index" var="item" id="atividadeContemAcaoRepeat" >
									<h:panelGrid columns="3">
										<h:selectOneMenu value="#{pwkf015.atividadeContemAcaoList[index]}" converter="comboGenericConverter" style="width:200px;">
											<f:selectItems value="#{facesUtil.convertToSelectItem[pwkf015.acoes]['descricao'][null]['selecione'][false]}" />
											<a4j:support event="onchange"
											 ajaxSingle="true"
											 action="#{controller.mostrarSimNao}"
											 reRender="formCad" />
										</h:selectOneMenu>
										<a4j:commandLink action="#{collectionsUtil.add(pwkf015.atividadeContemAcaoList,null)}"
														 reRender="comboContemAcaoPwkf015"
														 rendered="#{index==0}">
											<h:graphicImage alt="#{props.adicionar}" value="#{props.imagem_novo_18X18}"/>
										</a4j:commandLink>
										
										<a4j:commandLink action="#{pwkf015.atividadeContemAcaoListRemove((index))}"
														 reRender="comboContemAcaoPwkf015"
														 rendered="#{index!=0}">
											<h:graphicImage alt="#{props.excluir}" value="#{props.imagem_excluir}"/>
										</a4j:commandLink>
									</h:panelGrid>	
								</a4j:repeat>
							</h:panelGroup>

Aqui tenho meu método:

public void mostrarSimNao(){
		if (atividadeContemAcaoList==null){
			habilitaSimNao = true;
		}else{
			habilitaSimNao = false;
		}
	}

atividadeContemAcaoList é o meu Combo2 que quando está em “selecione” retorna NULL e na hora de comparar NULL==NULL isso é false!

lucasportela

qual o tipo desse objeto atividadeContemAcaoList? Apesar do nome sugestivo, tenho que perguntar porque eu já vi um método chamado commit() que não comitava.
tem como tirar um print da tela de debug mostrando o valor das variáveis no momento da comparação? Desculpe-me, mas só acredito vendo.

mateuscs

augusto compare da seguinte forma:

atividadeContemAcaoList.isEmpty();

augustovieira

Aqui tenho que ele vem NULL!

http://imageshack.us/photo/my-images/221/63436686.png/

E aqui tenho que NULL==NULL é FALSE! Para quem acredita só vendo

http://imageshack.us/photo/my-images/9/27293355.png/

lucasportela

augustovieira:
Aqui tenho que ele vem NULL!

http://imageshack.us/photo/my-images/221/63436686.png/

E aqui tenho que NULL==NULL é FALSE! Para quem acredita só vendo

http://imageshack.us/photo/my-images/9/27293355.png/

Você inseriu um elemento na lista com o valor null, mas a lista não está null. Ela está instanciada.

Pode notar que a lista tem o tamanho de 1 elemento, que o valor null. Se a lista estivesse vazia, o tamanho dela seria 0, se ela fosse null você nem ia saber o tamanho dela.

rmendes08

lucasportela:
augustovieira:
Aqui tenho que ele vem NULL!

http://imageshack.us/photo/my-images/221/63436686.png/

E aqui tenho que NULL==NULL é FALSE! Para quem acredita só vendo

http://imageshack.us/photo/my-images/9/27293355.png/

Você inseriu um elemento na lista com o valor null, mas a lista não está null. Ela está instanciada.

BINGO!

augustovieira

Solução?

lucasportela

Tomando como verdade na sua lógica que aquela condição tem que ser verdadeira… ou você NÃO adiciona o elemento na lista ou você percorre a lista e compara o valor do elemento.

Eu particularmente prefiro a 1ª opção por questão de desempenho, não precisa adicionar e nem percorrer. Mas só você sabe dizer qual é o melhor pro seu negócio. O que é bom pra mim as vezes não é o melhor pra sua lógica.

augustovieira

Eu tenho que ter aquele valor na lista! Só preciso saber algum jeito que creio que seja simple porém não estou conseguindo, de fazer essa minha comparação de NULL com NULL ser TRUE! Não é possível que nunca ninguém se deparou com a mesma situação!

lucasportela

se o elemento 0 da lista é nulo

if(atividadeContemAcaoList.get(0) == null)

ou percorrendo os elementos e verificando se tem algum não instanciado.

for(Object obj : atividadeContemAcaoList) {
    isTrue = (obj == null);
}

você tem que saber qual a regra, você tem uma lista, se é uma lista significa que serão vários elementos para inserir, então sugiro percorrer. Porém se vai ser uma lista de apenas um elemento, você deve rever isso e mudar para outro objeto que atenda sua regra, como por exemplo, um booleano.

rmendes08

O problema é que a sua lógica está errada. Naquele caso, você não tem que comparar se a lista é nula ou não, você tem que comparar se o valor selecionado no seu combobox é nulo.

augustovieira

Problema Resolvido, simples solução! Muito obrigado!!

if(atividadeContemAcaoList.get(0) == null)
lucasportela

O problema é que a sua lógica está errada. Naquele caso, você não tem que comparar se a lista é nula ou não, você tem que comparar se o valor selecionado no seu combobox é nulo.

augustovieira,

este problema foi resolvido, mas eu vejo isso como uma gambiarra. Você comparar um elemento fixo de uma lista não é algo normal, isso é sinal que tem que rever a lógica.

foi como o amigo falou, siga o conselho acima. Se baseie na lógica sugerida.

augustovieira

Na verdade não, no meu sistemas todos os selects tem como padrão o Selecione na posição 0, isso é feito dinâmicamente! Então não vejo como uma gambiarra! Eu precisava disso para fazer uns esquemas de habilita/desabilidar campos se ele estivesse com selecione ou não! e funcionou 100%! Obrigado novamente!

Criado 17 de julho de 2012
Ultima resposta 17 de jul. de 2012
Respostas 22
Participantes 5