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é!
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.