Extraño comportamiento de Java Operador ternario

¿Por qué funciona este código?

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

¿Y por qué esto arroja una excepción?

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

Pero lo más extraño es que este código también se ejecuta con éxito sin ninguna excepción:

 Float testFloat = null; Float f = testFloat; 

Parece que el operador ternario de Java cambia el comportamiento. ¿Alguien puede explicar por qué es esto, por favor?

El comportamiento se especifica en JLS – Operador condicional :

Si uno de los operandos segundo y tercero es de tipo primitivo T, y el tipo de otro es el resultado de aplicar conversión de boxeo (§5.1.7) a T, entonces el tipo de expresión condicional es T.

Énfasis mío Entonces, en el caso:

 Float f = true ? testFloat : 0f; 

Dado que el 3er operando es del tipo primitivo ( T ), el tipo de expresión sería el tipo flotante – T Por lo tanto, desempaquetar testFloat, que actualmente es una referencia null , para float dará como resultado NPE .


En cuanto al primer caso, la parte relevante es la última:

De lo contrario, el segundo y tercer operandos son de tipos S1 y S2, respectivamente. Deje que T1 sea del tipo que resulta de aplicar la conversión de boxeo a S1, y deje que T2 sea del tipo que resulta de aplicar la conversión de boxeo a S2. El tipo de expresión condicional es el resultado de aplicar la conversión de captura (§5.1.10) a lub (T1, T2) (§15.12.2.7).

Entonces, según esto:

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

y luego el tipo de expresión condicional se convierte en – Float . No se necesita unboxing de null , y por lo tanto no hay NPE .