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

时间:2012-11-08 14:38:26

标签: java null ternary-operator raw-types

我一直以为Java中的原始类型不能是null,因为如果我尝试这样做的话,这是一个编译时错误:

int test = null;

然而,在三元操作中,似乎允许:

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

(在这种情况下)不是三元操作的缩写:

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

当然不应该被允许。如果该条件失败,由于自动装箱,它将自动抛出NullPointerException。那么为什么java编译器不会像这样获取废话?

1 个答案:

答案 0 :(得分:13)

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

本质上,编译器应用自动装箱和-unboxing,以便该行看起来像这样:

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

实际上,自动装箱null会导致NullPointerException

  

那么为什么java编译器不会像这样获取废话?

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

Java语言规范的

Section 15.25解释了如何确定整个表达式的类型。

相关问题