Strano comportamento di Java. Operatore ternario

Perché questo codice funziona?

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

E perché fa un’eccezione?

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

Ma la cosa più strana è che questo codice viene eseguito anche senza eccezioni:

 Float testFloat = null; Float f = testFloat; 

Sembra che l’operatore ternario di Java cambi il comportamento. Qualcuno può spiegare perché questo è, per favore?

Il comportamento è specificato in JLS – Operatore condizionale :

Se uno dei secondi e terzi operandi è di tipo primitivo T, e il tipo dell’altro è il risultato dell’applicazione della conversione di boxe (§5.1.7) a T, il tipo dell’espressione condizionale è T.

Enfasi mia. Quindi, nel 2 ° caso:

 Float f = true ? testFloat : 0f; 

Dal momento che il terzo operando è di tipo primitivo ( T ), il tipo dell’espressione sarebbe di tipo float – T Quindi, unboxing testFloat che è attualmente un riferimento null , in float genererà NPE .


Per quanto riguarda il 1 ° caso, la parte rilevante è l’ultima:

Altrimenti, il secondo e il terzo operando sono rispettivamente dei tipi S1 e S2. Sia T1 il tipo risultante dall’applicazione della conversione di boxing in S1, e sia T2 il tipo risultante dall’applicazione della conversione di boxing in S2. Il tipo di espressione condizionale è il risultato dell’applicazione della conversione di cattura (§5.1.10) a lub (T1, T2) (§15.12.2.7).

Quindi, in base a questo:

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

e quindi il tipo di espressione condizionale diventa – Float . Nessun annullamento di null necessario, e quindi nessun NPE .