Teste de If

Sou novo em programação orientada a objetos e recentemente me deparei com uma peculiaridade, estou montando um banco de dados e dentro da minha classe DAO eu montei o seguinte teste:

public class Usuariodao {

    Connection con = Conect.conectar();

    public void salvar (Usuario usu) {		
		if (usu.getId()!=0 && usu.getId()!=null )  {
    		alterar(usu);
    	} else {
	    	cadastrar(usu);
		}
    }
}

Esse trecho do código consiste em testar se o id no Browser ficou em branco (nulo) ou com “0” e se assim for o programa deve criar u novo usuário. se o campo de id for preenchido com um valor o programa deve alterar o usuário no banco de dados correspondente a linha onde o id apontar.

Pois bem quando rodei o programa estava dando uma exception , porém foi só eu trocar a ordem dos comparadores dentro do if para

if (usu.getId() != null && usu.getId() != 0)

Que o programa rodou como eu queria, alguém sabe me explicar o por que isso ocorre?

Um tipo primitivo de instância nunca é null. Um int sempre será 0 como padrão. Eu realmente não sei o por que isso aconteceu, mas o que eu sei é que você não precisa testar se ele é igual ou diferente de null, porque ele nunca será null. Além disso, você pode tentar usar um bloco try catch que pega o NullPointerException. Funciona como um “se ele é null” também.

Quando você faz essa comparação de um tipo Integer com o primitivo int, o compilador vai forçar um “downcast” de Integer para int, para poder comparar os valores. Nesse caso, se a instância do Integer for null, na hora que o runtime vai tentar fazer a conversão para int acontece uma NullPointerException. É a mesma coisa de você tentar fazer isso aqui ó:

Integer x = null;
x.intValue(); // NullPointerException

O programa passa a funcionar quando você inverte a ordem dos operandos do && porque esse operador faz short-circuit. Isso significa que se o operador da esquerda é falso, ele nem testa o da direita, porque AND de falso com qualquer outra coisa vai dar falso. Isso acelera a execução, sem perder tempo com algo que não vai fazer diferença. No caso do id ser nulo, o operador && vai retornar false quando fizer essa checagem usu.getId()!=null, sem precisar fazer o teste que causa a NullPointerException.

Faltou postar a classe Usuario!

Nem precisa, não tem como comparar um primitivo com null, o compilador não deixa. Ele falou que era uma exception, então é erro de runtime, e não de compilação. Dá pra saber que é um Integer por causa disso :slight_smile: hehe

Posso concordo, mas, eu acho que uma pergunta bem feita é melhor do que nós imaginarmos isso … e devemos apontar o problema na real, como ele foi feito e dizer quais são as possíveis soluções.

Ressalva: Não podemos criar uma comunidade onde temos que adivinhar a metade da pergunta e informar todos os dados é uma obrigação de quem pergunta.

@lvbarbosa vlw cara… Entendi sua explicação e faz sentido… Mas no caso de cair no segundo comparador “usu.getId()!=0” não deveria apresentar nullpointexception tbm ?

Não porque se deu false no !=null, ele nem testa o segundo caso. Ele só testa o segundo caso quando dá true no primeiro. Se deu true no primeiro, não vai dar NullPointerException porque não é null hehe.

Aaaahhhhh intenddiiiiiiii… Pô… Boia man… Brigadão

Desculpa cara… Achei q tinha ficado claro… Eu encontrei a solução só queria saber pq qnd alterava a ordem dos compradores do If o programa dava o nullpointexception. Mas vou procurar ser mais claro na próxima vez… Mas vlw a atenção. Brigadão msm.