Pregunta ¿Es necesario un control nulo antes de llamar a instanceof?


Será null instanceof SomeClass regreso false o tirar un NullPointerException?


1085
2018-06-01 13:53


origen


Respuestas:


No, no se necesita una verificación nula antes de usar instanceof.

La expresion x instanceof SomeClass es false Si x es null.

De la Especificación de Lenguaje Java, sección 15.2.2, "Tipo de operador de comparación instanceof":

"En tiempo de ejecución, el resultado de la    instanceof operador es true Si el   valor de la RelationalExpression  es   no null y la referencia podría ser   lanzar a la Tipo de referencia   sin levantar una ClassCastException.   De lo contrario, el resultado es false"

Entonces, si el operando es nulo, el resultado es falso.


1453
2018-06-01 14:05



Usar una referencia nula como primer operando para instanceof devoluciones false.


237
2018-06-01 13:53



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 de la instanceof operador es true si el valor de la RelationalExpression no es null y la referencia podría ser enviada al Tipo de referencia sin levantar una ClassCastException. De lo contrario, el resultado es false.

API / Class # isInstance (Object)

Si esto Class objeto representa una interfaz, este método regresa true si la clase o cualquier superclase de la especificada Object el argumento implementa esta interfaz; vuelve false de otra manera. Si esto Class objeto representa un tipo primitivo, este método regresa false.


61
2017-07-29 11:55



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


23
2018-06-01 13:53



No. Literal de Java null no es una instancia de ninguna clase. Por lo tanto, no puede ser un en vez de cualquier clase. instanceof  Regresará ya sea false o true Por lo tanto, la <referenceVariable> instanceof <SomeClass> devoluciones false cuando referenceVariable el valor es nulo.


5
2018-05-27 10:59



los instanceof el operador no necesita explícita null cheques, ya que no arroja un NullPointerException si el operando es null.

En tiempo de ejecución, el resultado de la instanceof operador 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 instanceof el operador regresa false y por lo tanto, no se requieren verificaciones 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");
         }  
}

2
2018-04-01 08:09



Solo como un golosina:

Incluso (((A)null)instanceof A) regresará false.


(Si encasilla 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).
  }
}

Asi que Test.test((A)null) imprimirá a instanceof A: false.)


P.S .: Si está contratando, no use esto como una pregunta de entrevista de trabajo. :RE


2
2018-03-22 12:11