10

为什么这段代码有效?

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

为什么这会引发异常?

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

但最奇怪的是,这段代码也运行成功,没有任何异常:

Float testFloat = null;
Float f = testFloat;

Java的三元运算符似乎改变了行为。谁能解释一下这是为什么?

4

1 回答 1

16

该行为在JLS - Conditional Operator中指定:

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

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

Float f = true ? testFloat : 0f;

由于第三个操作数是原始类型(T),表达式的类型将是浮点类型 - T。因此,将当前作为参考的testFloat拆箱 将导致NPEnullfloat


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

否则,第二个和第三个操作数分别是 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.

于 2013-07-29T21:31:41.760 回答