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



我一直认为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;请注意,nullInteger的有效值。整个三元表达式的结果是Integer。您将其分配给int,因此Integer然后自动输入。

本质上,编译器应用自动氧化和 - 盒,以使该行看起来像这样:

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

的确,自动盒null导致NullPointerException

为什么Java-Compiler不这样胡说八道?

因为Java语言的设计师以这样的方式定义了语言,并且没有决定必须将其视为错误...

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

相关内容

  • 没有找到相关文章

最新更新