我一直以为Java中的原始类型不能是null
,因为如果我尝试这样做的话,这是一个编译时错误:
int test = null;
然而,在三元操作中,似乎允许:
int test = something != 0 ? 5 : null;
(在这种情况下)不是三元操作的缩写:
int test;
if (something != 0){
test = 5;
} else {
test = null
}
当然不应该被允许。如果该条件失败,由于自动装箱,它将自动抛出NullPointerException
。那么为什么java编译器不会像这样获取废话?
答案 0 :(得分:13)
Java编译器首先尝试使:
两侧的表达式类型相等。在这种情况下,它会将5
自动装箱到Integer
;请注意null
是Integer
的有效值。整个三元表达式的结果是Integer
。您将其分配给int
,然后Integer
将被自动装箱。
本质上,编译器应用自动装箱和-unboxing,以便该行看起来像这样:
int test = (something != 0 ? Integer.valueOf(5) : null).intValue();
实际上,自动装箱null
会导致NullPointerException
。
那么为什么java编译器不会像这样获取废话?
因为Java语言的设计者以这样的方式定义了语言,并且没有决定将其视为错误......
Java语言规范的Section 15.25解释了如何确定整个表达式的类型。