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

奇怪的Java行为。三元运算符,java,operator-keyword,ternary,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的三元运算符似乎改变了行为。有人能解释一下为什么会这样吗?这种行为是在: 如果第二个

为什么这个代码可以工作

Float testFloat = null;
Float f = true ? null : 0f;
为什么这会引发异常

Float testFloat = null;
Float f = true ? testFloat : 0f;
但最奇怪的是,这段代码也成功运行,没有任何异常:

Float testFloat = null;
Float f = testFloat;

Java的三元运算符似乎改变了行为。有人能解释一下为什么会这样吗?

这种行为是在:

如果第二个和第三个操作数中的一个是基元类型T,而另一个的类型是对T应用装箱转换(§5.1.7)的结果,则条件表达式的类型是T

我的。因此,在第二种情况下:

由于第三个操作数是基元类型(
T
),因此表达式的类型将是浮点类型-
T
。因此,将当前为
null
引用的testFloat解装箱到
float
将导致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
。不需要取消绑定
null
,因此不需要
NPE

我使用JDK 7u25运行它,它没有抛出任何异常。第三个代码不能抛出异常:您声明一个变量,将其设置为null,然后声明另一个变量,并将其设置为第一个变量的值,该变量为null。没有例外哦。。。我现在明白了!谢谢你的回答!我找不到确切的规则为什么
true?空值:0f
可以。你能在JLS中找到那个零件吗?或者简单地说是“如果第二个和第三个操作数具有相同的类型(可能是null类型),那么这就是条件表达式的类型。”,其中
0f
被装箱到
Float
?@Heuster。让我检查一下。这是一个好主意explanation@BrianAgnew. 谢谢:)
null type - S1
float     - S2

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