Est-ce que null instanceof SomeClassretourner falseou de jeter un NullPointerException?
Est-ce que null instanceof SomeClassretourner falseou de jeter un NullPointerException?
Réponses:
Non, une vérification nulle n'est pas nécessaire avant d'utiliser instanceof.
L'expression x instanceof SomeClassest falsesi xest 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'
instanceofopérateur esttruesi la valeur de RelationalExpression ne l'est pasnullet 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 itparce 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
instanceofopé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'
instanceofopérateur esttruesi la valeur de RelationalExpression ne l'est pasnullet que la référence peut être convertie en ReferenceType sans augmenter aClassCastException. Sinon, le résultat estfalse.
API / classe # isInstance (objet)
Si cet
Classobjet représente une interface, cette méthode renvoietruesi la classe ou toute superclasse de l'Objectargument spécifié implémente cette interface; il revientfalsesinon. Si cetClassobjet représente un type primitif, cette méthode retournefalse.
sn'est qu'une variable de référence d'objet. Il peut faire référence à un objet réellement existant ( "") ou à une nullréférence littérale.
nulln'est pas une donnée de chaîne, quelle que soit la variable qui la pointe. s instanceof Stringn'est pas le même que field.getType().equals(String.class), par exemple.
s instanceof Stringle sest remplacé par la valeur réelle, ce qui deviendrait "" instanceof Stringet null instanceof String. Penser à cela comme cela peut avoir plus de sens.
Non ce n'est pas. instanceofretournerait falsesi son premier opérande est null.
Tout comme une friandise :
Même reviendra .(((A)null)instanceof A)false
(Si le transtypage nullsemble 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 nulln'est une instance d'aucune classe. Par conséquent, il ne peut être une instance d' aucune classe. instanceof retournera soit falseoutrue donc les <referenceVariable> instanceof <SomeClass>retours falselorsque la referenceVariablevaleur est nulle.
L' instanceofopérateur n'a pas besoin de nullvérifications explicites , car il ne lance pas de a NullPointerExceptionsi l'opérande l'est null.
Au moment de l'exécution, le résultat de l' instanceofopérateur est vrai si la valeur de l'expression relationnelle ne l'est pas nullet 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' instanceofopérateur retourne falseet 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 instanceofest 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");
}
}