Será null instanceof SomeClassvolver falseo lanzar una NullPointerException?
Será null instanceof SomeClassvolver falseo lanzar una NullPointerException?
Respuestas:
No, no es necesaria una verificación nula antes de usar instanceof.
La expresión x instanceof SomeClasses falsesi xes null.
De la Especificación del lenguaje Java, sección 15.20.2, "Operador de comparación de tipos instanceof" :
"En el tiempo de ejecución, el resultado del
instanceofoperador estruesi el valor de RelationalExpression no esnully la referencia podría convertirse al ReferenceType sin generar unClassCastException. De lo contrario, el resultado esfalse".
Entonces, si el operando es nulo, el resultado es falso.
try itporque el comportamiento actual no es lo mismo que el comportamiento garantizado .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofoperador de Java era parte de Java 1.0, lanzado hace casi 20 años. Cambiar el comportamiento ahora de una manera que rompería el código existente es poco probable, a falta de algún beneficio que supere ese enorme costo. Hace veinte años, tal vez podría haber argumentos para devolver verdadero si el argumento pudiera ser lanzado, o lanzar una excepción para un argumento nulo. Pero esas definiciones habrían requerido verificaciones nulas separadas.
Muy buena pregunta de hecho. Solo 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. Operador de comparación de tipos instanceof
En tiempo de ejecución, el resultado del
instanceofoperador estruesi el valor de RelationalExpression no esnully la referencia podría convertirse al ReferenceType sin generar aClassCastException. De lo contrario, el resultado esfalse.
API / Class # isInstance (Object)
Si este
Classobjeto representa una interfaz, este método devuelvetruesi la clase o cualquier superclase delObjectargumento especificado implementa esta interfaz; vuelve defalseotra manera. Si esteClassobjeto representa un tipo primitivo, este método devuelvefalse.
ses solo una variable de referencia de objeto. Puede hacer referencia a un objeto realmente existente ( "") o puede hacer referencia a (la) nullreferencia literal.
nullno son datos de cadena, no importa qué variable lo apunte. s instanceof Stringno es lo mismo que field.getType().equals(String.class), por ejemplo.
s instanceof Stringla ses reemplazado con el valor real, por lo que se convertiría en "" instanceof Stringy null instanceof String. Pensar así puede tener más sentido.
No, no es. instanceofvolvería falsesi su primer operando es null.
Solo como un bocado :
Incluso volveremos .(((A)null)instanceof A)false
(Si la conversión tipográfica nullparece 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).
}
}
Entonces 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 se . El literal de Java nullno es una instancia de ninguna clase. Por lo tanto, no puede ser una instancia de ninguna clase. instanceof devolverá uno falseo,true por lo tanto, los <referenceVariable> instanceof <SomeClass>retornos falsecuando el referenceVariablevalor sea nulo.
El instanceofoperador no necesita nullcomprobaciones explícitas , ya que no arroja un NullPointerExceptionsi el operando es null.
En tiempo de ejecución, el resultado del instanceofoperador es verdadero si el valor de la expresión relacional no lo es nully la referencia podría convertirse al tipo de referencia sin generar una excepción de conversión de clase.
Si el operando es null, el instanceofoperador regresa falsey, 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 instanceofes 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");
}
}