¿Es necesario un control nulo antes de llamar a instanceof?

¿La null instanceof SomeClass devolverá false o arrojará una NullPointerException ?

No, no se necesita una verificación nula antes de usar instanceof.

La expresión x instanceof SomeClass es false si x es null .

De la Especificación del lenguaje Java, sección 15.2.2, “Tipo de operador de comparación instanceof” :

“En tiempo de ejecución, el resultado del operador instanceof es true si el valor de RelationalExpression no es null y la referencia se puede convertir al ReferenceType sin generar una ClassCastException . De lo contrario, el resultado es false “.

Entonces, si el operando es nulo, el resultado es falso.

El uso de una referencia nula como primer operando a instanceof devuelve false .

Muy buena pregunta de hecho. Lo intenté por mí mismo.

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

Huellas dactilares

 true true false false 

JLS / 15.20.2. Tipo de comparación de operador instanceof

En tiempo de ejecución, el resultado del operador instanceof es true si el valor de RelationalExpression no es null y la referencia se puede convertir al ReferenceType sin generar una ClassCastException . De lo contrario, el resultado es false .

API / Class # isInstance (Object)

Si este objeto de Class representa una interfaz, este método devuelve true si la clase o cualquier superclase del argumento de Object especificado implementa esta interfaz; devuelve false contrario. Si este objeto de Class representa un tipo primitivo, este método devuelve false .

No, no es. instanceof devolvería false si su primer operando es null .

No Java literal null no es una instancia de ninguna clase. Por lo tanto, no puede ser una instancia de ninguna clase. instanceof devolverá false o true por lo que la instanceof devuelve false cuando el valor de referenceVariable es nulo.

El operador instanceof no necesita comprobaciones null explícitas, ya que no lanza una NullPointerException si el operando es null .

En tiempo de ejecución, el resultado del operador instanceof es verdadero si el valor de la expresión relacional no es null y la referencia se puede convertir al tipo de referencia sin generar una excepción de lanzamiento de clase.

Si el operando es null , el operador instanceof devuelve false y, por lo tanto, no se requieren comprobaciones nulas explícitas.

Considera el siguiente ejemplo,

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

El uso correcto de instanceof es como se muestra a continuación,

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

Solo como un bocado

Incluso ( ((A)null) instanceof A) devolverá false .


(Si el encasillado null parece sorprendente, a veces tienes que hacerlo, por ejemplo en situaciones 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). } } 

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


PD: Si está contratando, no use esto como una pregunta de entrevista de trabajo. :RE