Est-ce que null instanceof SomeClass
retournera false
ou lancera un NullPointerException
?
Non, une vérification nulle n'est pas nécessaire avant d'utiliser instanceof.
L'expression x instanceof SomeClass
est false
si x
est null
.
À partir de la spécification de langage Java, section 15.20.2, "Instance d'opérateur de comparaison de types" :
"Au moment de l'exécution, le résultat de l'opérateur
instanceof
esttrue
si la valeur de l'expression relationnelle n'est pasnull
et la référence pourrait être transtypée en ReferenceType sans déclencher uneClassCastException
. Sinon, le résultat estfalse
."
Donc, si l'opérande est nul, le résultat est faux.
Utiliser une référence null comme premier opérande pour instanceof
renvoie false
.
Très bonne question en effet. Je viens d'essayer pour moi-même.
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));
}
}
Impressions
true
true
false
false
JLS/15.20.2. Instance d'opérateur de comparaison de type
Au moment de l'exécution, le résultat de l'opérateur
instanceof
esttrue
si la valeur de l'expression relationnelle n'est pasnull
et que la référence peut être Transformez en type ReferenceType sans déclencher uneClassCastException
. Sinon, le résultat estfalse
.
API/Classe # isInstance (Object)
Si cet objet
Class
représente une interface, cette méthode retournetrue
si la classe ou une superclasse de l'argument spécifiéObject
implémente cette interface; sinon, il retournefalse
. Si cet objetClass
représente un type primitif, cette méthode retournefalse
.
Non ce n'est pas. instanceof
renverrait false
si son premier opérande est null
.
Juste comme un friandise:
Même _(
_((A)null)
_instanceof A)
_ retournera false
.
(Si transtypage null
semble surprenant, vous devez parfois le faire, par exemple dans des situations comme celle-ci:
_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).
}
}
_
Donc, Test.test((A)null)
imprimera _a instanceof A: false
_.)
P.S .: Si vous embauchez, n'utilisez pas cette question comme une question d'entretien d'embauche. :RÉ
Non. Java literal null
n'est pas une instance d'une classe. Par conséquent, il ne peut s'agir d'une instanceof toute classe. instanceof
retournera soit false
ou true
donc le <referenceVariable> instanceof <SomeClass>
renvoie false
lorsque referenceVariable
valeur est nulle.
L'opérateur instanceof
n'a pas besoin de contrôles explicites null
, car il ne jette pas de NullPointerException
si l'opérande est null
.
Au moment de l'exécution, le résultat de l'opérateur instanceof
est true si la valeur de l'expression relationnelle n'est pas null
et que la référence peut être transtypée vers le type référence sans déclencher une exception de conversion de classe.
Si l'opérande est null
, l'opérateur instanceof
renvoie false
et, par conséquent, des vérifications nulles explicites ne sont pas nécessaires.
Considérons l'exemple ci-dessous,
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");
}
}
L’utilisation correcte de instanceof
est la suivante:
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");
}
}