java nullpointerexception - ¿Se necesita una comprobación nula antes de llamar a instanceof?




que java.lang.nullpointerexception (7)

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

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


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

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.


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 es true si el valor de la 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.


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






java nullpointerexception null