A verificação nula é necessária antes de chamar o instanceof?

A null instanceof SomeClass retornará false ou lançará um NullPointerException ?

Não, uma verificação nula não é necessária antes de usar instanceof.

A expressão x instanceof SomeClass é false se x for null .

Da Especificação da Linguagem Java, seção 15.2.2, “Exemplo de Operador de Comparação de Tipo” :

“No tempo de execução, o resultado do operador instanceof é true se o valor de RelationalExpression não for null e a referência puder ser convertida no ReferenceType sem gerar um ClassCastException . Caso contrário, o resultado será false .”

Então, se o operando é nulo, o resultado é falso.

Usando uma referência nula como o primeiro operando para instanceof retorna false .

Muito boa pergunta, de fato. Eu apenas tentei por mim mesmo.

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

Impressões

 true true false false 

JLS / 15.20.2. Tipo Comparador Operador instanceof

Em tempo de execução, o resultado do operador instanceof é true se o valor de RelationalExpression não for null e a referência puder ser convertida no ReferenceType sem gerar um ClassCastException . Caso contrário, o resultado é false .

API / class # isInstance (object)

Se esse object Class representar uma interface, esse método retornará true se a class ou qualquer superclass do argumento Object especificado implementar essa interface; ele retorna false outra forma. Se esse object Class representar um tipo primitivo, esse método retornará false .

Não, não é. instanceof retornaria false se seu primeiro operando fosse null .

Não O literal de Java null não é uma instância de nenhuma class. Portanto, não pode ser um exemplo de qualquer class. instanceof retornará false ou true portanto, a instanceof retornará false quando referenceVariable value for null.

O operador instanceof não precisa de verificações null explícitas, pois ele não lança um NullPointerException se o operando for null .

No tempo de execução, o resultado do operador instanceof será true se o valor da expressão relacional não for null e a referência puder ser convertida para o tipo de referência sem gerar uma exceção de conversão de class.

Se o operando for null , o operador instanceof retornará false e, portanto, as verificações nulas explícitas não serão necessárias.

Considere o exemplo abaixo,

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

O uso correto do instanceof é mostrado abaixo,

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

Apenas como um petisco :

Mesmo ( ((A)null) instanceof A) retornará false .


(Se typecasting null parece surpreendente, às vezes você tem que fazê-lo, por exemplo, em situações como esta:

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

Portanto, Test.test((A)null) imprimirá a instanceof A: false .


PS: Se você está contratando, por favor, não use isso como uma pergunta de entrevista de emprego. : D