2010-07-25 10 views

Antwort

18

Kein Vorteil auch immer, können Sie mit nur tun

if(a instanceof A) {} 

dies Rückkehr zu falsch beurteilen, ob ein null

ist
+5

+1 JLS: Zur Laufzeit ist das Ergebnis des Operators instanceof wahr, wenn die Der Wert der RelationalExpression ist nicht null, und die Referenz kann (15.16) in den ReferenceType umgewandelt werden, ohne dass eine ClassCastException ausgelöst wird. Ansonsten ist das Ergebnis falsch. http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#80289 – barrowc

+0

@barrowc Pin zeigte auf den Punkt! – naikus

+0

Ich programmiere Java seit '97 und das war neu für mich. Danke, +1! –

0

ich bezweifle ernsthaft, dass es keinen Vorteil für null ersten Überprüfung . Es hängt davon ab, wie die VM den Instant-Check implementiert ... Odds sind, dass es das if selbst als ersten Teil des Codes tut.

+1

Es ist nicht zu den VMs. Es ist die Lang-Spezifikation, der "Null-Typ" hat einen Wert: die Null-Referenz. Der NULL-Verweis ist vom Typ "null type" und daher gibt die obige Prüfung false für jeden anderen Typ – naikus

+0

zurück, den der VM den Code implementieren muss - und wahrscheinlich ist das erste, was er tut, auf Null zu prüfen - also gibt es keinen Leistungsgewinn von den Check-in durchführen. Das Ergebnis wird angegeben. Wie es das Ergebnis erreicht, ist nicht. – TofuBeer

+0

@TofuBeer Das Verhalten ist * angegeben. * Es * muss * auf Null prüfen. Es ist in keiner Weise eine Implementierung. – EJP

2

if(a instanceof A) ist genug.

Das Muster if(a!=null && expr) wird verwendet, wenn expr einen NullPointerException wirft, wenn a null ist. a instanceof A wirft keine NPE und gibt nur false zurück, wenn a null ist.

4

Die JVM muss selbst auf Null prüfen. Es macht nicht viel Sinn, es zweimal zu tun.

0

Der Operator instanceOf benötigt keine expliziten Nullprüfungen, da keine Nullzeigerausnahme ausgelöst wird, wenn der Operand null ist.

Zur Laufzeit ist das Ergebnis des instanceOf-Operators wahr, wenn der Wert des relationalen Ausdrucks nicht null ist und die Referenz in den Referenztyp umgewandelt werden kann, ohne dass eine Klassenausnahme ausgelöst wird.

Wenn der Operand null ist, gibt der Operator instanceOf false zurück, und daher sind explizite Nullprüfungen nicht erforderlich.

Betrachten Sie das folgende Beispiel,

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"); 
             } 
         } 

Die korrekte Verwendung von instanceOf wird, wie unten gezeigt,

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"); 
             } 
         } 
Verwandte Themen