Nullpointer [RESOLVIDO]

8 respostas
P

pessoal

Alguem sabe me dizer o pq esta dando nullpointer ??

Sei que tem algo a ver com o .equals, mas não sei como tratar isso:

if (!(consultaColetiva.getNumeroDispositivo().equals("")
						|| consultaColetiva.getNumeroDispositivo().equals(null)
						&& consultaColetiva.getNumeroSimcard().equals("")
						|| consultaColetiva.getNumeroSimcard().equals(null)
						&& consultaColetiva.getNumeroLinha().equals("") || consultaColetiva
						.getNumeroLinha().equals(null))) {

					if (!(consultaColetiva.getNumeroDispositivo().equals("") || consultaColetiva
							.getNumeroDispositivo().equals(null))
							&& consultaColetiva.getNumeroSimcard().equals("")
							|| consultaColetiva.getNumeroSimcard().equals(null)
							&& consultaColetiva.getNumeroLinha().equals("")
							|| consultaColetiva.getNumeroLinha().equals(null)) {

						dao.pesquisaDispositivoCL(consultaColetiva
								.getNumeroDispositivo());

					} else if (!(consultaColetiva.getNumeroSimcard().equals("") || consultaColetiva
							.getNumeroSimcard().equals(null))
							&& consultaColetiva.getNumeroDispositivo().equals(
									"")
							|| consultaColetiva.getNumeroDispositivo().equals(
									null)
							&& consultaColetiva.getNumeroLinha().equals("")
							|| consultaColetiva.getNumeroLinha().equals(null)) {

						dao.pesquisaSimCardCL(consultaColetiva
								.getNumeroSimcard());

					}  else {
						// GRAVA ERRO
						System.out.println("Linha Com mais de um Registro");
						dao.InsereLogErro(0, consultaColetiva.getNumeroSimcard(), nuLinhaAtual, CodProc);
						QtdeErro++;
						dao.QtdeErro(QtdeErro);
						dao.QtdeAlterada(QtdeAlt);
						continue;
					}
				} else {
					// GRAVA ERRO
					System.out.println("Campos Vazios");
					dao.InsereLogErro(0, "0", nuLinhaAtual, CodProc);
					QtdeErro++;
					dao.QtdeErro(QtdeErro);
					dao.QtdeAlterada(QtdeAlt);
					continue;

				}

8 Respostas

igor_ks

NullPointerException é a exception java mais famosa que existe, ela dá quando você está tentando acessar um objeto null (nulo)

Pra gente descobrir o porquê de ele estar nulo, fica mais fácil vc dizer (pelo stacktrace do erro) qual linha está dando erro no seu código. Dificilmente alguem vai ficar tentando entender seu código por inteiro, sem antes vc dar alguma dica para nós

P

É logo no primeiro if

Não coloquei o stacktrace, pois vai falar uma linha que não representaria a parte que coloquei aqui… para não ficar colando a classe toda…

Logo no primeiro if… se eu colocar “==” ao invés de .equals() , ele passa… só que interpreta como string… e não é isso que quero.

igor_ks
consultaColetiva.getNumeroSimcard().equals(null)

Quando vc vai ver se o objeto está nulo, vc obrigatoriamente (corrijam-me se nao for obrigatoriamente) precisa comparar com ==
Equals é para comparar objetos, da forma que vc está fazendo, vc está tentando acessar um objeto nulo para comparar se ele está nulo, por isso do nullpointer

P

então o correto é usar o == tanto para nulo, quanto para " " (vazio)?

pmlm

O problema está nos ifs

Em primeiro lugar, para ver se está null não se usa equals mas sim ==

Depois, deves sempre verificar primeiro se está a null e só depois ver se o conteúdo é ou não o que queres

Finalmente, juntar && e || no mesmo if raramente dá o resultado que o programador espera que dê. Neste caso deves usar parêntesis com a precedência de operações que desejas.

Assim, teremos de uma forma para mim mais legível:

if (campo1 != null && !campo1.trim().equals("") 
     && campo2 != null && !campo2.trim().equals("") .... ){

}

ou, seguindo a tua forma:

if (!( (campo1 == null || campo1.trim().equals("")) 
    && (campo2 == null || campo2.trim().equals(""))     )){

}
W

Abstraia os testes de nulidade em uma função chamada ANPE (evitar nullpointerexception). Isso agilizará seu desenvolvimento e deixará o código menor.

Desenvolvi uma função para isso após anos pensando em como melhorar o código nesta mesmo situação sua. Ela é bastante simples e flexível.

O link está em: http://oracle2java.blogspot.com.br/2012/11/java-evitar-nullpointerexception.html.

wiliamps

P

entendi… ok muito obrigado a vcs pelas informações…

WellingtonRamos

Uma boa prática é inverter as comparações. Agora você compara uma variável com uma constante. Inverta-as:

Você fez isso:

Mas deveria fazer:

Apesar de parecerem iguais, não são. No primeiro exemplo, se getAlgumaCoisa for nula, ao chamar o equals, vai ocorrer um NullPointerException.

É claro que, se suaVariavel fosse nula geraria NullPointerException mas acredito que seria testada antes de tudo.

A constante garantirá que o equals nunca disparará um NullPointerException.

PS: Se o Java 7 permite uma comparação entre strings usando == significa que a Oracle crê que ninguém usa esse tipo de comparação da forma que ela é aplicada atualmente (posição de memória). É obvio que será menos de 1% das aplicações com quebra de comportamento…

Criado 18 de fevereiro de 2013
Ultima resposta 18 de fev. de 2013
Respostas 8
Participantes 5