1614 votes

La vérification de nullité est-elle nécessaire avant d'appeler instanceof ?

Will null instanceof SomeClass retourner false ou lancer un NullPointerException ?

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.

2185voto

Andy Thomas Points 30979

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 est true si le valeur de la Expression relationnelle est pas null et la référence pourrait être dans le Type de référence sans soulever un ClassCastException . Sinon, le résultat est false ."

Ainsi, si l'opérande est nul, le résultat est faux.

445 votes

Cette réponse est plus correcte que try it parce que comportement actuel n'est pas la même chose que comportement garanti .

4 votes

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

22 votes

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".

323voto

Bozho Points 273663

L'utilisation d'une référence nulle en tant que première opérande à instanceof renvoie à false .

297 votes

(Et maintenant, il faut 10 secondes pour trouver cette question dans Google)

85voto

Jin Kwon Points 2191

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 est true si la valeur de la Expression relationnelle n'est pas null et la référence pourrait être coulée dans le Type de référence sans soulever un ClassCastException . Sinon, le résultat est false .

API / Class#isInstance(Objet)

Si cela Class représente une interface, cette méthode renvoie true si la classe ou toute superclasse de la classe spécifiée Object implémente cette interface ; il renvoie false autrement. Si cette Class représente un type primitif, cette méthode renvoie l'information suivante false .

1 votes

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 ?

1 votes

@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.

0 votes

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...

28voto

RoflcoptrException Points 22111

Non, ça ne l'est pas. instanceof rendrait false si son premier opérande est null .

26voto

Attila Tanyi Points 181

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.com

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.

Powered by:

X