web-dev-qa-db-fra.com

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

Est-ce que null instanceof SomeClass retournera false ou lancera un NullPointerException?

1245
Johan Lübcke

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 est true si la valeur de l'expression relationnelle n'est pas null et la référence pourrait être transtypée en ReferenceType sans déclencher une ClassCastException. Sinon, le résultat est false."

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

1696
Andy Thomas

Utiliser une référence null comme premier opérande pour instanceof renvoie false.

255
Bozho

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 est true si la valeur de l'expression relationnelle n'est pas null et que la référence peut être Transformez en type ReferenceType sans déclencher une ClassCastException. Sinon, le résultat est false.

API/Classe # isInstance (Object)

Si cet objet Class représente une interface, cette méthode retourne true si la classe ou une superclasse de l'argument spécifié Object implémente cette interface; sinon, il retourne false. Si cet objet Class représente un type primitif, cette méthode retourne false.

69
Jin Kwon

Non ce n'est pas. instanceof renverrait false si son premier opérande est null.

24

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É

10
Attila Tanyi

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. instanceofretournera soit false ou true donc le <referenceVariable> instanceof <SomeClass> renvoie false lorsque referenceVariable valeur est nulle.

6
display_name

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");
         }  
}
1
Nikhil Kumar