奇怪的Java行为。 三元运算符

为什么这段代码有效?

Float testFloat = null; Float f = true ? null : 0f; 

为什么会抛出exception呢?

 Float testFloat = null; Float f = true ? testFloat : 0f; 

但最奇怪的是,此代码也成功运行,没有任何例外:

 Float testFloat = null; Float f = testFloat; 

似乎Java的三元运算符改变了行为。 谁能解释为什么会这样,拜托?

行为在JLS中指定- 条件运算符 :

如果第二个和第三个操作数之一是原始类型T,而另一个操作数的类型是对T应用装箱转换(第5.1.7节)的结果,那么条件表达式的类型是T.

强调我的。 所以,在第二种情况下:

 Float f = true ? testFloat : 0f; 

由于第3个操作数是基本类型( T ),因此表达式的类型将是float类型T 。 因此,当前为null引用的拆箱 testFloatfloat将导致NPE


至于一种情况,相关部分是最后一种:

否则,第二和第三操作数分别是S1和S2类型。 设T1是将拳击转换应用到S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型。 条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果。

所以,根据这个:

 null type - S1 float - S2 null type - T1 (boxing null type gives null type) Float - T2 (float boxed to Float) 

然后条件表达式的类型变为 – Float 。 不需要取消装箱,因此没有NPE