在JDK8和JDK10上三元运算符行为的差异
- 论坛
- 在JDK8和JDK10上三元运算符行为的差异
22 浏览
在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