2013-07-29 17 views
9

Perché questo codice funziona?Strano comportamento di Java. Operatore ternario

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

E perché questo genera un'eccezione?

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

Ma la cosa più strana è che questo codice viene eseguito anche con successo senza alcuna eccezione:

Float testFloat = null; 
Float f = testFloat; 

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

+0

L'ho eseguito con JDK 7u25 e non ha fatto eccezioni. –

+0

Il terzo codice non può generare eccezioni: si dichiara una variabile, la si imposta su null, quindi si dichiara un altro e lo si imposta sul valore del primo che è null. Nessuna eccezione potrebbe essere generata –

risposta

13

Il comportamento è specificato in JLS - Conditional Operator:

Se una delle seconde e terze operandi è di tipo primitivo T, e il tipo di l'altro è il risultato dell'applicazione di conversione boxe (§5.1.7) a T, quindi il tipo di espressione condizionale è T.

Enfasi mia. Così, nel 2 ° caso:

Float f = true ? testFloat : 0f; 

Dal 3 operando è di tipo primitivo (T), il tipo di espressione sarebbe di tipo float - T. Così, unboxingtestFloat che è attualmente un punto di riferimento null, a float si tradurrà in NPE.


Come per il caso v, parte rilevante è l'ultimo:

caso contrario, il secondo e terzo operandi sono di tipo S1 e S2, rispettivamente. 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, secondo questa:

null type - S1 
float  - S2 

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

e poi tipo di espressione condizionale diventa - Float. Non è necessario unboxing di null e quindi non NPE.

+0

Oh ... l'ho capito ora! Grazie mille per la risposta! – user2452103

+0

Non sono riuscito a trovare la regola esatta perché 'vero? null: 0f' è ok, però. Puoi individuare quella parte nel JLS? O sarebbe semplicemente "Se il secondo e il terzo operando hanno lo stesso tipo (che può essere il tipo null), allora questo è il tipo di espressione condizionale.", Dove '0f' è inserito in' Float'? –

+0

@Heuster. Fammi controllare. –