¿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
estrue
si el valor de RelationalExpression no esnull
y la referencia se puede convertir al ReferenceType sin generar unaClassCastException
. De lo contrario, el resultado esfalse
“.
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
estrue
si el valor de RelationalExpression no esnull
y la referencia se puede convertir al ReferenceType sin generar unaClassCastException
. De lo contrario, el resultado esfalse
.
API / Class # isInstance (Object)
Si este objeto de
Class
representa una interfaz, este método devuelvetrue
si la clase o cualquier superclase del argumento deObject
especificado implementa esta interfaz; devuelvefalse
contrario. Si este objeto deClass
representa un tipo primitivo, este método devuelvefalse
.
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
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