【发布时间】:2018-11-19 01:26:36
【问题描述】:
考虑下面的代码
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
【问题讨论】:
-
这段代码在 intelliJ Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10) 2018-04-17 中运行没有问题
-
@Radiodef 对我来说,
false ? 1.0 : (Double) null为两个 JDK(JDK 1.8.0_144 和 JDK 10.0.1)抛出一个NPE,而new HashMap<...>...-version 只为 JDK 10.0 抛出。 1. -
我认为投掷是正确的行为,所以我猜这是/曾经是一个错误。见§15.25 under Table 15.25-D:结果类型应该是
double,所以应该是unboxed。 -
@Radiodef 在 Java 8 规范中也是如此。
标签: java java-8 javac unboxing java-10