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
instanceofestruesi el valor de RelationalExpression no esnully 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
Classrepresenta una interfaz, este método devuelvetruesi la clase o cualquier superclase del argumentoObjectespecificado implementa esta interfaz; devuelvefalsecontrario. Si este objeto deClassrepresenta 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
instanceofestruesi el valor de la RelationalExpression no esnully 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.