Will null instanceof SomeClass
retourner false
ou lancer un NullPointerException
?
Cette réponse est plus correcte que try it
parce que comportement actuel n'est pas la même chose que comportement garanti .
Will null instanceof SomeClass
retourner false
ou lancer un NullPointerException
?
Non, une vérification de nullité n'est pas nécessaire avant d'utiliser instanceof.
L'expression x instanceof SomeClass
est false
si x
est null
.
La spécification du langage Java 11 l'exprime de manière concise en section 15.20.2, "Opérateur de comparaison de types instanceof". . ( Java 17 exprime cela de manière moins concise après l'introduction du patternmatching instanceof).
"Au moment de l'exécution, le résultat de la
instanceof
L'opérateur esttrue
si le valeur de la Expression relationnelle est pasnull
et la référence pourrait être dans le Type de référence sans soulever unClassCastException
. Sinon, le résultat estfalse
."
Ainsi, si l'opérande est nul, le résultat est faux.
Cette réponse est plus correcte que try it
parce que comportement actuel n'est pas la même chose que comportement garanti .
Cette question se pose lors du chapitre de Joshua Bloch sur l'égalité des objets dans Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
Plus précisément, au point 8, il note que dans les méthodes equals(), un opérateur instanceof sert deux objectifs - il vérifie que l'argument est à la fois non nul et du bon type. "...[S]o you don't need a separate null check".
Très bonne question en effet. Je viens d'essayer par 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));
}
}
Imprimés
true
true
false
false
JLS / 15.20.2. Opérateur de comparaison de types instanceof
Au moment de l'exécution, le résultat de la
instanceof
L'opérateur esttrue
si la valeur de la Expression relationnelle n'est pasnull
et la référence pourrait être coulée dans le Type de référence sans soulever unClassCastException
. Sinon, le résultat estfalse
.
Si cela
Class
représente une interface, cette méthode renvoietrue
si la classe ou toute superclasse de la classe spécifiéeObject
implémente cette interface ; il renvoiefalse
autrement. Si cetteClass
représente un type primitif, cette méthode renvoie l'information suivantefalse
.
C'est un peu confus. s est une chaîne parce que c'est écrit "String s", s n'est pas une chaîne parce qu'elle est nulle. Alors qu'est-ce que c'est que s ?
@KaiWang s
est juste une variable de référence d'objet. Elle peut faire référence à un objet existant( ""
) ou il peut faire référence à un(e) null
référence littérale.
Je suis toujours confus. s peut être null maintenant, mais il ne peut être pointé vers une instance de String que plus tard. Il ne peut pas être pointé vers, par exemple, un Integer. Donc c'est toujours une sorte de chaîne, même si c'est un null. Ca n'a pas beaucoup de sens...
Tout comme un tidbit :
Même (
((A)null)
instanceof A)
retournera false
.
(Si le typecasting null
Cela peut paraître surprenant, mais il faut 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).
}
}
Alors Test.test((A)null)
imprimera a instanceof A: false
.)
P.S. : Si vous recrutez, veuillez ne pas utiliser ceci comme question d'entretien d'embauche. :D
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
C'est également "important" ou du moins très utile comme ligne de départ (ou très tôt) des "meilleures pratiques" pour toute méthode Compare ou Equals ou similaire qui est conçue pour ne réussir que sur des objets non nuls du même type, et vous protège contre les "cas stupides" en une seule ligne. moins de code = moins de bogues.
21 votes
Pour intervenir dans le débat "est-ce utile ?", je n'ai jamais écrit mon propre code Java (je ne sais donc pas facilement où se trouvent les spécifications, et la compilation d'un test serait très difficile), mais je suis actuellement en train de convertir manuellement Java en JavaScript. Mon code échouait sur une référence nulle, et une recherche sur Google m'a permis de voir la réponse acceptée, qui a confirmé que c'était un comportement attendu et qu'il me manquait une vérification implicite de nullité. Très utile, dans mon cas.