我一直认为Java中的原始类型不能为null
,因为如果我尝试执行这样的操作,这是一个编译时间错误:
int test = null;
但是,在三元操作中,似乎可以:
int test = something != 0 ? 5 : null;
不是(在这种情况下)简称的三元操作:
int test;
if (something != 0){
test = 5;
} else {
test = null
}
当然不允许哪个。如果该条件失败,则由于自动氧基量,它将自动扔NullPointerException
。那么,为什么Java-Compiler不这样胡说八道?
发生的事情是,Java编译器首先尝试使:
两侧的表达式类型相等。在这种情况下,它将5
自动介绍到Integer
;请注意,null
是Integer
的有效值。整个三元表达式的结果是Integer
。您将其分配给int
,因此Integer
然后自动输入。
本质上,编译器应用自动氧化和 - 盒,以使该行看起来像这样:
int test = (something != 0 ? Integer.valueOf(5) : null).intValue();
的确,自动盒null
导致NullPointerException
。
为什么Java-Compiler不这样胡说八道?
因为Java语言的设计师以这样的方式定义了语言,并且没有决定必须将其视为错误...
Java语言规范的第15.25节说明了如何确定整个表达式的类型。