java - sola - Obtener NullPointerException no deseado en operador ternario-¿Por qué?
operador ternario java ejemplos (2)
Esta pregunta ya tiene una respuesta aquí:
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
.