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

Raf*_*l T 12 java null ternary-operator raw-types

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

int test = null;
Run Code Online (Sandbox Code Playgroud)

但是在三元操作中,似乎允许:

int test = something != 0 ? 5 : null;
Run Code Online (Sandbox Code Playgroud)

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

int test;
if (something != 0){
    test = 5;
} else {
    test = null
}
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*per 13

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

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

int test = (something != 0 ? Integer.valueOf(5) : null).intValue();
Run Code Online (Sandbox Code Playgroud)

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

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

因为Java语言的设计者以这样的方式定义了语言,所以它并没有决定这必须被视为错误......

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