这是该规范的相关报价(第15.25.2节):
布尔条件表达式是独立表达式(第15.2节)。
布尔条件表达式的类型确定如下:
如果第二和第三操作数均为type
Boolean,则条件表达式的类型为Boolean。否则,条件表达式的类型为
boolean。
因此,整个表达式的类型被认为是
boolean,并且该
Boolean值被自动取消装箱,从而导致
NullPointerException。
如评论中所述,以下内容为何不引发异常?
return val == null ? null : "true".equalsIgnoreCase(val);
好吧,以上摘自规范的摘要仅适用于
布尔条件表达式,在
此指定(第15.25节):
如果第二和第三操作数表达式都是 布尔表达式 ,则条件表达式是布尔条件表达式。
为了对条件进行分类,以下表达式是布尔表达式:
*类型为或的独立形式(第15.2节)的表达式。
boolean``Boolean*带括号的
boolean表达式(第15.8.5节)。*类的类实例创建表达式(§15.9)
Boolean。*方法调用表达式(第15.12节),为其选择的最特定方法(第15.12.2.5节)具有返回类型
boolean或Boolean。
(请注意,对于泛型方法,这是实例化方法的类型参数之前的类型。)
- 甲
boolean条件表达式。
由于
null不是 布尔表达式 ,因此整体条件表达式不是 布尔条件表达式。参见表15.2(在同一部分后面),我们可以看到这样的表达式被认为具有
Boolean类型,因此不会发生拆箱,也不会引发异常。


![为什么三元运算会给nullpointer而ifelse却没有呢?[重复] 为什么三元运算会给nullpointer而ifelse却没有呢?[重复]](http://www.mshxw.com/aiimages/31/496170.png)
