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
.