Diferencia en el comportamiento del operador ternario en JDK8 y JDK10
Considere el siguiente código
public class JDK10Test {
public static void main(String[] args) {
Double d = false ? 1.0 : new HashMap<String, Double>().get("1");
System.out.println(d);
}
}
Cuando se ejecuta en JDK8, este código imprimenull
mientras que en JDK10 este código da como resultadoNullPointerException
Exception in thread "main" java.lang.NullPointerException
at JDK10Test.main(JDK10Test.java:5)
El código de bytes producido por los compiladores es casi idéntico, aparte de dos instrucciones adicionales producidas por el compilador JDK10 que están relacionadas con el autoboxing y parecen ser responsables del NPE.
15: invokevirtual #7 // Method java/lang/Double.doubleValue:()D
18: invokestatic #8 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
Es este comportamiento un error en JDK10 o un cambio intencional para hacer el comportamiento más estricto?
JDK8: java version "1.8.0_172"
JDK10: java version "10.0.1" 2018-04-17