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 .