NullPointer em ternario

7 respostas
L

Olha, eu pensei que sabia como funcionava o Ternario… mas essa não entendi

Porque nesse código da nullPointer apenas na atribuição do Integer e não na String?

String xx = "seila";
String a1 = ("lala".equals(xx)) ? "0" : ("bebe".equals(xx)) ? "1" : null;
Integer a2 = ("lala".equals(xx)) ? 0 : ("bebe".equals(xx)) ? 1 : null;

e se você fizer isso

String xx = "seila";
Integer a2 = ("lala".equals(xx)) ? 0 : null;

ou isso

String xx = "seila";
Integer x;
if ("lala".equals(xx)) {
   x = 0;
}
else {
   if ("bebe".equals(xx)) {
      x = 1;
   }
   else {
      x = null;
   }
}

Não ocorre erro…

8O :?: :???:

7 Respostas

E

Cara eu mudei teu código onde tinha somente 0 e 1 eu coloquei new Integer(0) e new Integer(1) e rodou legal.
Eu tive que mudar porque estava aparecendo um erro de compilador com a mensagem: Incompatible conditional operand types int and null. Acho que ele não tava fazendo o cast pra Integer com o 0 e o 1.
Com a mudança o código ficou assim:

String xx = "seila"; String a1 = ("lala".equals(xx)) ? "0" : ("bebe".equals(xx)) ? "1" : null; Integer a2 = ("lala".equals(xx)) ? new Integer(0) : ("bebe".equals(xx)) ? new Integer(1) : null;

V

eusourafael, você deve estar usando JDK 1.4 enquanto luBS deve ser o 1.5.
Porque o tipo de retorno deve ser o mesmo nesse “if”. No seu caso teve que colocar dois objetos, enquando no do luBs provavelmente aconteceu o tal do empacotando automático, que é transformar o inteiro em classe.
Quanto ao null exception eu não olhei ainda.

Edit: A exception deve ser lançada na hora que você USA o objeto do tipo Integer, e não na atribuição.

L

Sim, estou usando java 1.5, esqueci de mencionar.
E não, o erro ocorre realmente na linha da atribuição mesmo =/ mesmo que eu não use o objeto a2 (atribuido) ele da erro. Eu imagino que ele tente criar um Integer passando null, mas se esse for o caso, porque não ocorre erro tb com a String?! e porque num ternario atribuindo Integer simples tb não ocorre?! ai que fiquei bolado… seila não consegui entender por que…

não que eu precise resolver esse problema, existe 1001 outras maneiras de fazer isso, eu só fiquei curioso de saber por que da erro. Se eu visse um treco desse tipo eu nunca diria que daria erro, ainda mais um nullPointer…

E

Certo, eu estou usando o 1.4 aí tinha visto pelo código que ele tava utilizando o 5 aí falei “Acho que ele não tava fazendo o cast pra Integer com o 0 e o 1.”, o tal do empacotamento automático.
luBS, você testou colocando o new Integer(0) e new Integer(1)??? Aqui não gerou exceção com esse novo código.

L

Sim, se eu colocar new Integer(1) etc funciona.
Alias, se eu fizer isso apenas

Integer a = "b".equals(x) ? new Integer(1) : "c".equals(x) ? 2 : null;

funciona, mas se eu fizer

Integer a = "b".equals(x) ? 1 : "c".equals(x) ? new Integer(2) : null;

da erro, olhando isso devo imaginar que o erro está no empacotamento, agora queria saber porque, minha intenção não é fazer funcionar a atribuição e sim entender porque da erro . :???:

E

Ah beleza então. Agora o motivo também não entendi hehehe…Se descobrir o motivo posta aí pra gente. Valeu.

S

O que eu imagino é que ele tente fazer autoboxing, usando new Integer(null), o que gera o erro.

Essas formas “abreviadas” às vezes fazem coisas implícitas. Exemplo:

byte b = 10; b = b + 5; //erro b += 5; // ok

Criado 15 de setembro de 2006
Ultima resposta 15 de set. de 2006
Respostas 7
Participantes 4