>我正在阅读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 类型。