Frage Ist vor dem Aufruf von instanceof eine Nullprüfung erforderlich?


Wille null instanceof SomeClass Rückkehr false oder wirf einen NullPointerException?


1085
2018-06-01 13:53


Ursprung


Antworten:


Nein, vor der Verwendung von instanceof ist keine Nullprüfung erforderlich.

Der Ausdruck x instanceof SomeClass ist false ob x ist null.

Aus der Java-Sprachspezifikation Abschnitt 15.2.2, "Typvergleich operator instanceof":

"Zur Laufzeit ist das Ergebnis der    instanceof Betreiber ist true wenn die   Wert des RelationalExpression  ist   nicht null und die Referenz könnte sein   in die werfen Referenztyp   ohne zu erhöhen ClassCastException.   Sonst ist das Ergebnis false. "

Wenn der Operand null ist, ist das Ergebnis falsch.


1453
2018-06-01 14:05



Verwenden einer Nullreferenz als ersten Operanden für instanceof kehrt zurück false.


237
2018-06-01 13:53



Sehr gute Frage in der Tat. Ich habe es nur für mich selbst versucht.

public class IsInstanceOfTest {

    public static void main(final String[] args) {

        String s;

        s = "";

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));

        s = null;

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));
    }
}

Drucke

true
true
false
false

JLS / 15.20.2. Typ Vergleichsoperator instanceof

Zur Laufzeit ist das Ergebnis der instanceof Betreiber ist true wenn der Wert der RelationalExpression ist nicht null und die Referenz könnte auf die geworfen werden Referenztyp ohne zu erhöhen ClassCastException. Sonst ist das Ergebnis false.

API / Klasse # isInstance (Objekt)

Wenn das ist Class Objekt stellt eine Schnittstelle dar, diese Methode gibt zurück true wenn die Klasse oder eine Oberklasse des angegebenen Object Argument implementiert diese Schnittstelle; es kehrt zurück false Andernfalls. Wenn das ist Class Objekt repräsentiert einen primitiven Typ, diese Methode gibt zurück false.


61
2017-07-29 11:55



Nein, ist es nicht. instanceof würde zurückkehren false wenn sein erster Operand ist null.


23
2018-06-01 13:53



Nein. Java-Literal null ist keine Instanz einer Klasse. Daher kann es nicht sein instanceof jede Klasse. instanceof  wird entweder zurückkehren false oder true deshalb, die <referenceVariable> instanceof <SomeClass> kehrt zurück false wann referenceVariable Wert ist null.


5
2018-05-27 10:59



Das instanceof Operator braucht nicht explizit null überprüft, wie es nicht wirft NullPointerException wenn der Operand ist null.

Zur Laufzeit ist das Ergebnis der instanceof Operator ist wahr, wenn der Wert des relationalen Ausdrucks nicht stimmt null und die Referenz könnte in den Referenztyp umgewandelt werden, ohne dass eine Klassenausnahme ausgelöst wird.

Wenn der Operand ist null, das instanceof Bediener kehrt zurück false und daher sind explizite Null-Checks nicht erforderlich.

Betrachten Sie das folgende Beispiel,

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

Die korrekte Verwendung von instanceof ist wie unten gezeigt,

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

2
2018-04-01 08:09



Nur als Leckerbissen:

Sogar (((A)null)instanceof A) wird zurückkehren false.


(Wenn typecasting null scheint überraschend, manchmal müssen Sie es tun, zum Beispiel in Situationen wie:

public class Test
{
  public static void test(A a)
  {
    System.out.println("a instanceof A: " + (a instanceof A));
  }

  public static void test(B b) {
    // Overloaded version. Would cause reference ambiguity (compile error)
    // if Test.a(null) was called without casting.
    // So you need to call Test.test((A)null) or Test.test((B)null).
  }
}

Damit Test.test((A)null) wird gedruckt a instanceof A: false.)


P.S .: Wenn Sie einstellen, verwenden Sie dies bitte nicht als Vorstellungsgespräch. : D


2
2018-03-22 12:11