为什么这段代码有效?
Float testFloat = null;
Float f = true ? null : 0f;
为什么这会引发异常?
Float testFloat = null;
Float f = true ? testFloat : 0f;
但最奇怪的是,这段代码也运行成功,没有任何异常:
Float testFloat = null;
Float f = testFloat;
Java的三元运算符似乎改变了行为。谁能解释一下这是为什么?
为什么这段代码有效?
Float testFloat = null;
Float f = true ? null : 0f;
为什么这会引发异常?
Float testFloat = null;
Float f = true ? testFloat : 0f;
但最奇怪的是,这段代码也运行成功,没有任何异常:
Float testFloat = null;
Float f = testFloat;
Java的三元运算符似乎改变了行为。谁能解释一下这是为什么?
该行为在JLS - Conditional Operator中指定:
如果第二个和第三个操作数之一是原始类型 T,而另一个的类型是对 T 应用装箱转换(第 5.1.7 节)的结果,则条件表达式的类型为T。
强调我的。所以,在第二种情况下:
Float f = true ? testFloat : 0f;
由于第三个操作数是原始类型(T
),表达式的类型将是浮点类型 - T
。因此,将当前作为参考的testFloat拆箱 将导致NPE。null
float
至于第一种情况,相关部分是最后一种:
否则,第二个和第三个操作数分别是 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
.