为什么我可以在三元操作中将原始类型设置为null

我一直认为Java中的原始类型不能为null ,因为如果我尝试执行以下操作,则编译时错误:

 int test = null; 

然而,在三元操作中,似乎允许:

 int test = something != 0 ? 5 : null; 

不是三元操作(在这种情况下):

 int test; if (something != 0){ test = 5; } else { test = null } 

当然不应该被允许。 如果该条件失败,由于自动装箱,它将自动抛出NullPointerException 。 那么为什么java编译器不会像这样获取废话呢?

会发生什么是Java编译器首先尝试在以下两侧的表达式中创建表达式的类型。 在这种情况下,它将5自动装箱为Integer ; 请注意, nullInteger的有效值。 整个三元表达式的结果是Integer 。 您将其分配给int ,因此Integer被自动装箱。

本质上,编译器应用autoboxing和-unboxing,以便该行看起来像这样:

 int test = (something != 0 ? Integer.valueOf(5) : null).intValue(); 

实际上,autounboxing null会导致NullPointerException

那么为什么java编译器不会像这样获取废话呢?

因为Java语言的设计者以这样的方式定义了语言,并且没有决定这必须被视为错误……

Java语言规范的第15.25节解释了如何确定整个表达式的类型。