2015-11-20 9 views
8

Eclipse visualizza un avviso quando si confrontano due espressioni identiche:Perché non c'è un avviso per null == null?

if (1 == 1) -> warning 
if (a == a) -> warning 

Tuttavia, nessun avviso viene visualizzato per null == null (nonostante il fatto che null == null è sempre vero):

if (null == null) -> no warning 

C'è qualche motivo per Questo ?

+4

null sarà sempre nullo, ma poiché 'null' identifica un oggetto (che non esiste, ma è ancora un oggetto), deve essere confrontato. – Laurens

+1

@Laurens ma poi, perché un avviso per a == a? (un essere un oggetto nullo) – fxm

+0

Perché hai inizializzato 'a'. Non hai detto al compilatore che cosa era "null" – Laurens

risposta

3

Aiuta a pensare a cosa questa condizione di avviso sta cercando di prevenire. Il suo scopo è quello di avvisare che non si stanno confrontando le due variabili che si desidera confrontare, ad esempio a causa di un errore di battitura (ad esempio foo == foo quando si intende foo == boo o foo == fpp) o due valori letterali (ad esempio 1 == 1).

(Naturalmente, confrontando due valori letterali presenta un problema differente -. Il risultato sarà sempre lo stesso, e deve solo essere semplificato in true o false nel codice comunque)

null == null non è un caso di questo potenziale problema. Se stai nominando una variabile qualcosa vicino a "null" e poi scrivendo "null" per errore, hai un problema completamente diverso a cui nessun compilatore può intuire.

1

Per primitive tipi come int e char, il valore è noto al compilatore. È possibile confrontarli e viene immediatamente rilevato come valori identici che causano un avviso.

Ad esempio:

'A' == 'A' 

O anche:

'A' == 97 

Per oggetti, il valore non è ancora noto al compilatore. Non è stato assegnato uno spazio nella memoria in cui si trova questo valore. Il riferimento al valore deve essere controllato in fase di esecuzione anche se si tratta del riferimento Null.

Ad esempio:

null == null 

o

"abc" == "abc" 

Tuttavia, si otterrà un avvertimento per il confronto di un oggetto a se stesso. Questo perché hai definito questo oggetto esplicitamente in modo che il compilatore sappia che è identico senza doverne verificare il valore.

Problemi correlati