在JDK8和JDK10上三元运算符行为的差异

22 浏览
0 Comments

在JDK8和JDK10上三元运算符行为的差异

考虑以下代码:

public class JDK10Test {
    public static void main(String[] args) {
        Double d = false ? 1.0 : new HashMap().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中的一个bug还是一种有意的更严格行为的改变呢?

JDK8:  java version "1.8.0_172"
JDK10: java version "10.0.1" 2018-04-17

0