作为三元运算符编译的结果,为什么返回null(需要布尔值)?

Mic*_*Kay 6 java ternary-operator

我刚刚注意到的一种好奇心,而不是一个问题.

我不被允许写

public boolean x() {
  return null;
}
Run Code Online (Sandbox Code Playgroud)

或这个:

public boolean x() {
  if (DEBUG) {
    return true;
  } else {
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

但我被允许写

public boolean x() {
  return DEBUG ? true : null;
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?(如果采用"else"分支,它似乎会抛出NPE.)

Pau*_*aul 11

正如jls所述:

条件表达式的类型确定如下:如果第二个和第三个操作数具有相同的类型(可以是空类型),那么这就是条件表达式的类型.如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是将装箱转换(第5.1.7节)应用于T的结果,那么条件表达式的类型是T.

这意味着Java允许null的,因为它可以用来产生的一个实例Boolean,其可以是装箱到boolean(读有关部分拳击 JLS中以获得更多信息).但是,由于Boolean实例已初始化null,因此调用booleanValue()将导致a NullPointerException.