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

时间:2013-07-29 21:28:07

标签: java operator-keyword ternary

为什么这段代码有效?

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

为什么会抛出异常?

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

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

Float testFloat = null;
Float f = testFloat;

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

1 个答案:

答案 0 :(得分:14)

行为在JLS - Conditional Operator中指定:

  

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

强调我的。所以,在2 nd 案例中:

Float f = true ? testFloat : 0f;

由于第3个操作数是基本类型(T),因此表达式的类型为float类型 - T。因此,取消装箱 testFloat 目前是null引用,float将导致 NPE


对于1 st 的情况,相关部分是最后一个:

  

否则,第二和第三操作数分别为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。不需要取消装箱null,因此不需要NPE