允许空值的装箱,那么为什么不允许取消装箱



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

然后我读到null的拆箱转换抛出了一个NullPointerException.好的,这是显而易见的。那么为什么null的拳击不会抛出NullPointerException,拳击null价值有什么用?

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

但是,您不能这样做:

int intPrimitive = intObject; // not fine

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

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

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

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

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

相关内容

最新更新