2010-08-23 13 views
5

tengo el siguiente fragmento de código que está causando me molesta, donde currentRate y secondCurrentRate son objetos dobles, correctamente definida:Doble = null está causando una NullPointerException

(currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 

Esto debe comprobar cada uno doble para nula -ness y asigne el valor nulo en consecuencia. Sin embargo, si secondCurrentRate es nulo, esto causa una NullPointerException. He cambiado el fragmento a esto:

(currentRate == null | secondCurrentRate == null) ? null : currentRate * secondCurrentRate; 

y esto funciona como se esperaba. Mi pregunta es por qué está pasando esto? Pude entenderlo si estaba llamando a algún método sobre los objetos, pero entendí que NullPointerExceptions se lanzaba cuando se llamaba a un método en un objeto nulo. Hay un objeto nulo pero no hay una llamada a método.

¿Alguien puede dar alguna idea de esto? Esto se está ejecutando en Java 5.

+0

En su segundo fragmento, ¿es "||" o "|"? –

+1

@ Thierry-Dimitri Roy es lo mismo en este caso. –

+0

Proporcione un programa breve pero completo que demuestre el problema. –

Respuesta

5

Creo que su problema está en otra parte.

Esto funciona:

Double currentRate=null, secondCurrentRate =null; 
    Double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 

Pero si usted ha hecho esto, se producirá un NPE:

Double currentRate=null, secondCurrentRate =null; 
    double test = (currentRate != null && secondCurrentRate != null) ? currentRate * secondCurrentRate : null; 
+0

0 abajo vote \t Lo he intentado y aunque el compilador no permite doble a = nulo; ¿Te dejará feliz escribir doble a = 0.0> 1.0? a: nulo; que compilará pero arrojará NPE. Esa es la depuración de energía psíquica que estás haciendo aquí ;-) – egbokul

+0

De hecho, con el operador ternario, la JVM considerará nulo como un 'Doble' y luego lo desunirá en un 'doble' y luego se bloqueará :) –

1

El tipo de operador condicional es en realidad quite complicated. Yo creo lo que sucede en su primer ejemplo, es la siguiente: El segundo operando de la condicional,

currentRate * secondCurrentRate 

es de tipo double, y esto también se convierte en el tipo de la expresión completa. Entonces, cuando cualquiera de los valores es nulo, intenta establecer el valor de la expresión en Double nulo, que se desempaqueta en un double y causa un NPE.

El motivo por el que funciona la segunda expresión se debe a una semántica ligeramente diferente de la expresión condicional en este caso.

Cuestiones relacionadas