Questão boa de Operador Lógico

Olhem a seguinte questão:


public class Principal {
	public static void main(String[] args) {
		String str=null;
		
		if(str==null  | str.equals(""))
			System.out.println("É nulo ou eh vazio");
	}
	 
}

Qual o resultado:

java.lang.NullPointerException. Simplesmente por causa do operador | (ou não inteligente) se fosse ||(ou inteligente) não daria:
Ou seja


if(str==null  || str.equals(""))
	System.out.println("É nulo ou eh vazio");

Iria imprimir “É nulo ou eh vazio”, simplesmente porque o operador |(ou) , testa todas as expressões para verificar o resultado, e o ||(ou) testa até achar uma verdadeira e já retorna verdadeiro!!

Boa pegadinha, pra SCJP!!

Valeu

[quote=danielbussade]…
java.lang.NullPointerException. Simplesmente por causa do operador | (ou não inteligente) se fosse ||(ou inteligente) não daria:

[/quote]
O assunto é básico e se baseia nos operadores de curto-circuito. Para uma questão de SCJP acho muito simples.

Até!

acho que não…

Isso é mto básico

vou torcer para cair algo nesse nivel na minha prova =)

nao eh q ele testa ate achar a opcao verdadeira…e se nao tiver? :?

o operador | ele passa em tds as expressoes…ate se a primeira exp. for verdadeira…
ja o || ele nao analisa a 2 expr. se a 1 for verdadeira …

abs

Já vi cair questões desse tipo na prova, mas não tão básicas.
Envolviam i++ e ++i e as expressões eram métodos que retornavam boolean.

Mas, afinal, qual é a utilidade dos operadores & e | em comparações lógicas? Legado?

Legal a questão!!.

Eu não acho que seja uma questão facil…o problema não é em saber que o operador | compara os dois lados e || compara apenas o lado esquedo(isso realmente é basico para a prova).O problema é em saber que no método public boolean equals(Object arg) implementando na classe String ele tenta comparar null == “” e isso faz lançar uma NullPointerException.Se o método tivesse algum tratamento para o null a resposta teria sido outra, ou seja, foi necessario conhecer a implementação do método equals() na classe String tbm.E para quem está começando os estudo para certificação não é obrigado a conhecer como o método equals na classe String foi implementado…

Abraços

Te garanto que muita gente cai nessa questão na hora da prova…
E te digo mais, existem questões na nova certificação (1.5) que são muito mais ridiculas do que esta…

[quote=Lintz_net]Legal a questão!!.

Eu não acho que seja uma questão facil…o problema não é em saber que o operador | compara os dois lados e || compara apenas o lado esquedo(isso realmente é basico para a prova).O problema é em saber que no método public boolean equals(Object arg) implementando na classe String ele tenta comparar null == “” e isso faz lançar uma NullPointerException.Se o método tivesse algum tratamento para o null a resposta teria sido outra, ou seja, foi necessario conhecer a implementação do método equals() na classe String tbm.E para quem está começando os estudo para certificação não é obrigado a conhecer como o método equals na classe String foi implementado…

Abraços[/quote]
Não viaja. Independente de qual seja o método, você está chamando null.metodo(), que obviamente gera exceção. E o método equals() trata null.
A questão é realmente boba.

Também considero fácil!

Esses tipos de questões tem que ser analisadas com muita atenção. Acho que o problema está quando você lê e passa despercebido.

Exemplos:

(x | y)
e
(x || y)

Outro:

boolean a = true;
boolean b = false;

if(a != b){ //xxxxxx }
e
if(a =! b){ //xxxxxx }

Essa jogadas de caracter acabam confundindo. Por isso atenção e paciência são essenciais.

Até mais.

String str = null; try{ System.out.println(str.equals("")); }catch(NullPointerException e){ e.printStackTrace(); }

pq nao pegou minha exceção?

Olá, não entendi, esse pq não pegou minha exceção ??

Aqui ele imprimi a stack trace correta:
java.lang.NullPointerException

Att

[quote=danielbussade]Olá, não entendi, esse pq não pegou minha exceção ??

Aqui ele imprimi a stack trace correta:
java.lang.NullPointerException

Att[/quote]

é, viajei msm…

Você pode usar isso para tornar uma expressão aparentemente simples em algo um pouco mais cavernoso… como isso:

int x = 4;
int y = 2;

if ( ((x | y) == 6) | ((x & y) == 0)) {

}

Agora é só perguntar se o código compila. Fica mais malicioso pq mistura operadores binários com os operadores lógicos sem curto circuito. E “cheira” errado para o despreparado.

Ainda assim, não é uma questão das mais difíceis.