Рассмотрим следующий код
public class JDK10Test {
public static void main(String[] args) {
Double d = false ? 1.0 : new HashMap<String, Double>().get("1");
System.out.println(d);
}
}
При запуске на JDK8 этот код печатает null
тогда как в JDK10 этот код приводит к NullPointerException
Exception in thread "main" java.lang.NullPointerException
at JDK10Test.main(JDK10Test.java:5)
Байт-код, созданный компиляторами, почти идентичен, кроме двух дополнительных инструкций, созданных компилятором JDK10, которые связаны с автобоксингом и, по-видимому, отвечают за NPE.
15: invokevirtual #7 // Method java/lang/Double.doubleValue:()D
18: invokestatic #8 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
Является ли это поведение ошибкой в JDK10 или намеренным изменением, чтобы сделать поведение более строгим?
JDK8: java version "1.8.0_172"
JDK10: java version "10.0.1" 2018-04-17