try que catch java nullpointerexception null

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 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 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 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


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.