2009-06-10 11 views
22

No puedo encontrar la parte relevante de la especificación para responder a esto. En una instrucción de operador condicional en Java, ¿se evalúan los argumentos verdadero y falso?Java ternario (inmediato si) evaluación

Así podría la siguiente lanzar una NullPointerException

Integer test = null; 

test != null ? test.intValue() : 0; 
+3

También es algo tan simple que puedes probarlo y ver qué sucede :) –

+7

que te da información sobre una instancia en particular. Es mejor encontrar lo que dice el estándar. –

Respuesta

43

Desde que quería la especificación, aquí está (de §15.25 Conditional Operator ? :, la última frase de la sección):

The operand expression not chosen is not evaluated for that particular evaluation of the conditional expression.

8

No, no podría. Eso es lo mismo que:

Integer test = null; 
if (test != null) { 
    test = test.intValue(); 
} 
else { 
    test = 0; 
} 
0

la sintaxis es incorrecta.

Entero test = (test! = Null)? test.intValue(): 0;

creo que sirve ....

+1

¿Declarar y hacer referencia a la variable en la misma línea? * "Error: variable' test' podría no haberse inicializado "* – Pang

7

Sé que es antiguo puesto, pero miro caso muy similar y luego me votación: P

Responder a la pregunta original: solo operando se evalúa PERO:

@Test 
public void test() 
{ 
    Integer A = null; 
    Integer B = null; 

    Integer chosenInteger = A != null ? A.intValue() : B;  
} 

Esta prueba arrojará NullPointerException siempre y en este caso IF statemat no es equivalente a?: Operador.

El motivo es aquí http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25. La parte sobre el boxeo/unboxing está envuelto, pero se puede entender fácilmente mirando:

"If one of the second and third operands is of type boolean and the type of the other is of type Boolean , then the type of the conditional expression is boolean ."

Lo mismo se aplica a Integer.intValue()

Saludos!

+2

Dato interesante, gracias Michal. Como A.intValue() es del tipo int, la referencia a B debe ser unboxed automáticamente. Pero es nulo, por lo que arroja NPE. En Java 8/Eclipse Luna con análisis nulo activado, ¡esta prueba ni siquiera se compila! –

Cuestiones relacionadas