una ternario sola operador linea hacer formas ejemplos java nullpointerexception double conditional-operator

java - sola - Obtener NullPointerException no deseado en operador ternario-¿Por qué?



operador ternario java ejemplos (2)

Mientras ejecuto el siguiente código, NullPointerException una NullPointerException en la línea:

value = condition ? getDouble() : 1.0;

En líneas anteriores, cuando uso null lugar de getDouble() todo funciona y esto es extraño.

public class Test { static Double getDouble() { return null; } public static void main(String[] args) { boolean condition = true; Double value; value = condition ? null : 1.0; //works fine System.out.println(value); //prints null value = condition ? getDouble() : 1.0; //throws NPE System.out.println(value); } }

¿Alguien puede ayudarme a entender este comportamiento?


Cuando escribes

value = condition ? null : 1.0;

el tipo de condition ? null : 1.0 condition ? null : 1.0 debe ser un tipo de referencia, por lo que el tipo es Double , que puede mantener el valor null .

Cuando escribes

value = condition ? getDouble() : 1.0;

y getDouble() devuelve null , es equivalente a escribir:

value = condition ? ((Double) null) : 1.0;

En este caso, el compilador ve un Double y un double como el segundo y tercer argumentos del operador condicional ternario, y decide que el tipo de expresión debe ser el double . Por lo tanto, unboxes el null para double , obteniendo NullPointerException .

El tipo del operador ternario condicional está determinado por algunas tablas en JLS 15.25 .

Si el 2º y 3er operandos son null y double , el tipo de expresión condicional es el límite superior mínimo de Double y null , que es Double .

Si los operandos segundo y tercero son Double y double , el tipo de expresión condicional es double .


Ver #jls-15.25 :

Si el segundo operando es Double , mientras que el tercer operando es double , el resultado:

getCount() == 1 ? getDouble() : 1.0

será un double .

Y cuando intente convertir un Double null (devuelto por getDouble() ) al double , se lanzará NPE .