java - que - ¿Se necesita una comprobación nula antes de llamar a instanceof?
nullpointerexception java que es (7)
El operador instanceof
no necesita comprobaciones null
explícitas, ya que no lanza una NullPointerException
si el operando es null
.
En el 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 podría convertirse en el tipo de referencia sin generar una excepción de conversión de clase.
Si el operando es null
, el operador instanceof
devuelve false
y, por lo tanto, no se requieren comprobaciones nulas explícitas.
Considere 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");
}
}
¿La null instanceof SomeClass
devolverá false
o lanzará una NullPointerException
?
Muy buena pregunta por cierto. Acabo de intentar 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. Operador de comparación de tipo
En el tiempo de ejecución, el resultado del operador
instanceof
estrue
si el valor de RelationalExpression no esnull
y la referencia podría convertirse en el ReferenceType sin generar unaClassCastException
. De lo contrario el resultado esfalse
.
API / Clase # isInstance (Objeto)
Si este objeto de
Class
representa una interfaz, este método devuelvetrue
si la clase o cualquier superclase del argumentoObject
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, no se necesita una comprobación nula antes de utilizar 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, "Operador de comparación de tipo de instancia" :
"En el tiempo de ejecución, el resultado del operador
instanceof
estrue
si el valor de la 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.
Sólo como un tidbit :
Incluso (
((A)null)
instanceof A)
devolverá false
.
(Si la conversión a null
parece sorprendente, a veces hay 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.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
De modo que Test.test((A)null)
imprimirá a instanceof A: false
.
PD: Si está contratando, no use esto como una pregunta de entrevista de trabajo. :RE
Usar una referencia nula como el primer operando a instanceof
devuelve false
.
No Java null
literal 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 tanto, la <referenceVariable> instanceof <SomeClass>
devuelve false
cuando el valor de referenceVariable
sea nulo.