允许空值的装箱然后为什么不允许拆箱?

时间:2014-03-31 06:45:11

标签: java null boxing

我正在阅读jls §5.1.7,它说有9种类型的拳击,第9种是拳击From the null type to the null type

然后我读到null的{​​{3}}会引发NullPointerException。好的,很明显。 那么为什么null的拳击不会引发NullPointerException以及拳击null值的用途是什么?

2 个答案:

答案 0 :(得分:1)

null转换为Integer不会抛出NullPointerException,因为null是任何引用的有效值,例如: Integer intObject = null; // fine

但是,你不能这样做:

int intPrimitive = intObject; // not fine

因为当您尝试将Integer转换为int时,会在后台调用Integer.intValue(),但调用null引用上的任何方法都会引发NPE:

Object whatever = null;
whatever.anyMethod(); // always throws NPE

因为引用指向null,而不是所选类型的实际对象。

答案 1 :(得分:0)

我认为您提供的文件给出了答案。 “这条规则是必要的,因为条件运算符将装箱转换应用于其操作数的类型,并在进一步的计算中使用结果。”

如果?:的第二个和第三个操作数之一不是布尔值或数字表达式,则可以使用装箱。例如,true?1:2的类型为int,而true?null:1的类型为Integer。在第二个例子中,采用自动装箱。并且在运行时,第二个示例的类型将为null类型,因为当装箱为null类型时,将获得null类型。