È necessario il controllo nullo prima di chiamare instanceof?

L’ null instanceof SomeClass restituirà false o NullPointerException ?

No, non è necessario un controllo nullo prima di utilizzare instanceof.

L’espressione x instanceof SomeClass è false se x è null .

Dalla specifica del linguaggio Java, sezione 15.2.2, “Tipo di operatore dell’istanza di confronto” :

“In fase di esecuzione, il risultato dell’operatore instanceof è true se il valore di RelationalExpression non è null e il riferimento può essere eseguito su ReferenceType senza generare ClassCastException . In caso contrario, il risultato è false .”

Quindi se l’operando è nullo, il risultato è falso.

L’utilizzo di un riferimento null come primo operando su instanceof restituisce false .

Davvero una bella domanda. Ho appena provato per me stesso.

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

stampe

 true true false false 

JLS / 15.20.2. Digitare Operatore di confronto instanceof

In fase di esecuzione, il risultato dell’operatore instanceof è true se il valore di RelationalExpression non è null e il riferimento potrebbe essere convertito in ReferenceType senza generare ClassCastException . Altrimenti il ​​risultato è false .

API / Class # isInstance (Object)

Se questo object Class rappresenta un’interfaccia, questo metodo restituisce true se la class o qualsiasi superclass Object Argomento specificato implementa questa interfaccia; restituisce false altrimenti. Se questo object Class rappresenta un tipo primitivo, questo metodo restituisce false .

No non lo è. instanceof restituirebbe false se il suo primo operando è null .

No Il valore letterale Java null non è un’istanza di alcuna class. Pertanto non può essere un’istanza di alcuna class. instanceof restituirà false o true quindi l’ instanceof restituisce false quando referenceVariable value è null.

L’operatore instanceof non ha bisogno di controlli null espliciti, in quanto non genera NullPointerException se l’operando è null .

In fase di esecuzione, il risultato dell’operatore instanceof è true se il valore dell’espressione relazionale non è null e il riferimento può essere convertito nel tipo di riferimento senza generare un’eccezione di class cast.

Se l’operando è null , l’operatore instanceof restituisce false e quindi non sono richiesti controlli nulli espliciti.

Considera l’esempio seguente,

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

L’uso corretto di instanceof è come mostrato di seguito,

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

Proprio come un bocconcino :

L’ instanceof A) Even ( ((A)null) instanceof A) restituirà false .


(Se il typecasting null sembra sorprendente, a volte devi farlo, ad esempio in situazioni come questa:

 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). } } 

Quindi Test.test((A)null) stamperà a instanceof A: false .)


PS: Se stai assumendo, per favore non usare questo come domanda di colloquio di lavoro. : D