2010-07-25 9 views

risposta

18

alcun vantaggio, si può semplicemente fare con

if(a instanceof A) {} 

questo ritorno valutare a false se a è null

+5

+1 JLS: in fase di esecuzione, il risultato dell'operatore instanceof è vero se la il valore di RelationalExpression non è nullo e il riferimento potrebbe essere trasmesso (§15.16) a ReferenceType senza generare un ClassCastException. Altrimenti il ​​risultato è falso. http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#80289 – barrowc

+0

pin @barrowc puntato sul punto! – naikus

+0

Ho programmato Java dal '97 e questa era una novità per me. Grazie, +1! –

0

ho seri dubbi che che non v'è alcun beneficio per il controllo di nulla prima . Spetta a come la VM implementa l'assegno di controllo ... le probabilità sono se stesso come prima parte del codice.

+1

Non è fino alle macchine virtuali. È la specifica lang, il "tipo nullo" ha un valore: il riferimento null. Il riferimento null è di tipo "tipo nullo" e quindi il controllo sopra riportato restituisce falso per qualsiasi altro tipo, – naikus

+0

, ma la VM deve implementare il codice, e probabilmente la prima cosa che fa è controllare null, quindi non c'è alcun guadagno in termini di prestazioni mettendo il check-in. Il RISULTATO è specificato. Come raggiunge il risultato non lo è. – TofuBeer

+0

@TofuBeer Il comportamento è * specificato. * È * necessario * verificare la presenza di null. Non dipende da un'implementazione in alcun modo. – EJP

2

if(a instanceof A) è sufficiente.

Il modello if(a!=null && expr) viene utilizzato quando expr genera uno NullPointerException se a è nullo. a instanceof A non lancia un NPE e restituisce semplicemente false se a è nullo.

4

La JVM deve verificare se stesso null. Non ha molto senso farlo due volte.

0

L'operatore instanceOf non richiede controlli nulli espliciti, in quanto non genera un'eccezione di puntatore nullo se l'operando è nullo.

In fase di esecuzione, il risultato dell'operatore instanceOf è true se il valore dell'espressione relazionale non è nullo e il riferimento può essere convertito nel tipo di riferimento senza generare un'eccezione di classe cast.

Se l'operando è nullo, l'operatore instanceOf restituisce false e quindi non sono richiesti controlli nulli espliciti.

consideri l'esempio seguente,

public static void main(String[] args) { 
             if(a != null && a instanceof ArrayList){                     //Violation 
                  System.out.println("In if block"); 
             } 
             else 
             { 
                  System.out.println("In else block"); 
             } 
         } 

L'uso corretto di instanceof è il seguente,

public static void main(String[] args) { 
           
             if(a instanceof ArrayList){                     //Correct way 
                  System.out.println("In if block"); 
             } 
             else 
             { 
                  System.out.println("In else block"); 
             } 
         }