Será null instanceof SomeClass
volver false
o lanzar una NullPointerException
?
Será null instanceof SomeClass
volver false
o lanzar una NullPointerException
?
Respuestas:
No, no es necesaria una verificación nula antes de usar instanceof.
La expresión x instanceof SomeClass
es false
si x
es 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
instanceof
operador estrue
si el valor de RelationalExpression no esnull
y 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 it
porque el comportamiento actual no es lo mismo que el comportamiento garantizado .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
operador 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
instanceof
operador estrue
si el valor de RelationalExpression no esnull
y la referencia podría convertirse al ReferenceType sin generar aClassCastException
. De lo contrario, el resultado esfalse
.
API / Class # isInstance (Object)
Si este
Class
objeto representa una interfaz, este método devuelvetrue
si la clase o cualquier superclase delObject
argumento especificado implementa esta interfaz; vuelve defalse
otra manera. Si esteClass
objeto representa un tipo primitivo, este método devuelvefalse
.
s
es solo una variable de referencia de objeto. Puede hacer referencia a un objeto realmente existente ( ""
) o puede hacer referencia a (la) null
referencia literal.
null
no son datos de cadena, no importa qué variable lo apunte. s instanceof String
no es lo mismo que field.getType().equals(String.class)
, por ejemplo.
s instanceof String
la s
es reemplazado con el valor real, por lo que se convertiría en "" instanceof String
y null instanceof String
. Pensar así puede tener más sentido.
No, no es. instanceof
volvería false
si su primer operando es null
.
Solo como un bocado :
Incluso volveremos .(
((A)null)
instanceof A)
false
(Si la conversión tipográfica 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).
}
}
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 null
no es una instancia de ninguna clase. Por lo tanto, no puede ser una instancia de ninguna clase. instanceof
devolverá uno false
o,true
por lo tanto, los <referenceVariable> instanceof <SomeClass>
retornos false
cuando el referenceVariable
valor sea nulo.
El instanceof
operador no necesita null
comprobaciones explícitas , ya que no arroja un NullPointerException
si el operando es null
.
En tiempo de ejecución, el resultado del instanceof
operador es verdadero si el valor de la expresión relacional no lo es null
y 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 instanceof
operador regresa 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");
}
}