12

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

int test = null;

但是在三元运算中,似乎是允许的:

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

三元运算不就是(在这种情况下)的缩写吗:

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

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

4

1 回答 1

13

:发生的情况是 Java 编译器首先尝试使表达式的类型位于相等的两侧。在这种情况下,它将自动装箱5Integer; 请注意,这null是 的有效值Integer。整个三元表达式的结果是Integer。您将其分配给 ,int然后Integer自动拆箱。

本质上,编译器应用了自动装箱和 -unboxing,因此该行将如下所示:

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

事实上,自动拆箱null会导致NullPointerException.

那么为什么 java-compiler 不获取这样的废话呢?

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

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

于 2012-11-08T14:46:04.100 回答