为什么我可以在三元操作中将原始类型设置为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
; 请注意, null
是Integer
的有效值。 整个三元表达式的结果是Integer
。 您将其分配给int
,因此Integer
被自动装箱。
本质上,编译器应用autoboxing和-unboxing,以便该行看起来像这样:
int test = (something != 0 ? Integer.valueOf(5) : null).intValue();
实际上,autounboxing null
会导致NullPointerException
。
那么为什么java编译器不会像这样获取废话呢?
因为Java语言的设计者以这样的方式定义了语言,并且没有决定这必须被视为错误……
Java语言规范的第15.25节解释了如何确定整个表达式的类型。