que - nullpointerexception java try catch




¿Se necesita una comprobación nula antes de llamar a instanceof? (5)

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 es true si el valor de RelationalExpression no es null y la referencia podría convertirse en el ReferenceType sin generar una ClassCastException . De lo contrario el resultado es false .

API / Clase # isInstance (Objeto)

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


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


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.





null