Est-ce que null instanceof SomeClass
retourner false
ou de jeter un NullPointerException
?
Est-ce que null instanceof SomeClass
retourner false
ou de jeter un NullPointerException
?
Réponses:
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
.
Dans la spécification du langage Java, section 15.20.2, «Opérateur de comparaison de type instanceof» :
"Au moment de l'exécution, le résultat de l'
instanceof
opérateur esttrue
si la valeur de RelationalExpression ne l'est pasnull
et que la référence peut être convertie en ReferenceType sans augmenter aClassCastException
. Sinon, le résultat estfalse
."
Donc, si l'opérande est nul, le résultat est faux.
try it
parce que le comportement actuel n'est pas le même que le comportement garanti .
Effective Java
- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceof
opérateur de Java faisait partie de Java 1.0, sorti il y a près de 20 ans. Il est peu probable de changer le comportement d'une manière qui briserait le code existant, en l'absence d'un avantage qui l'emporte sur cet énorme coût. Il y a vingt ans, il aurait peut-être pu y avoir des arguments pour renvoyer true si l'argument pouvait être casté, ou lever une exception pour un argument nul. Mais ces définitions auraient nécessité des vérifications nulles distinctes.
Très bonne question en effet. J'ai juste essayé pour moi.
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. Opérateur de comparaison de type instanceof
Au moment de l'exécution, le résultat de l'
instanceof
opérateur esttrue
si la valeur de RelationalExpression ne l'est pasnull
et que la référence peut être convertie en ReferenceType sans augmenter aClassCastException
. Sinon, le résultat estfalse
.
API / classe # isInstance (objet)
Si cet
Class
objet représente une interface, cette méthode renvoietrue
si la classe ou toute superclasse de l'Object
argument spécifié implémente cette interface; il revientfalse
sinon. Si cetClass
objet représente un type primitif, cette méthode retournefalse
.
s
n'est qu'une variable de référence d'objet. Il peut faire référence à un objet réellement existant ( ""
) ou à une null
référence littérale.
null
n'est pas une donnée de chaîne, quelle que soit la variable qui la pointe. s instanceof String
n'est pas le même que field.getType().equals(String.class)
, par exemple.
s instanceof String
le s
est remplacé par la valeur réelle, ce qui deviendrait "" instanceof String
et null instanceof String
. Penser à cela comme cela peut avoir plus de sens.
Non ce n'est pas. instanceof
retournerait false
si son premier opérande est null
.
Tout comme une friandise :
Même reviendra .(
((A)null)
instanceof A)
false
(Si le 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).
}
}
Ainsi Test.test((A)null)
imprimera a instanceof A: false
.)
PS: Si vous embauchez, veuillez ne pas l'utiliser comme une question d'entretien d'embauche. :RÉ
Non . Le littéral Java null
n'est une instance d'aucune classe. Par conséquent, il ne peut être une instance d' aucune classe. instanceof
retournera soit false
outrue
donc les <referenceVariable> instanceof <SomeClass>
retours false
lorsque la referenceVariable
valeur est nulle.
L' instanceof
opérateur n'a pas besoin de null
vérifications explicites , car il ne lance pas de a NullPointerException
si l'opérande l'est null
.
Au moment de l'exécution, le résultat de l' instanceof
opérateur est vrai si la valeur de l'expression relationnelle ne l'est pas null
et que la référence peut être convertie en type de référence sans déclencher une exception de conversion de classe.
Si l'opérande l'est null
, l' instanceof
opérateur retourne false
et par conséquent, des vérifications null explicites ne sont pas requises.
Considérez 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 comme indiqué ci-dessous,
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");
}
}