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.

6voto

saurav Points 486

Non, un null n'est pas nécessaire avant d'appeler instanceof . Elle renvoie toujours false si sa valeur est null .

Conformément à Spécification du langage Java pour la comparaison en utilisant instanceof .

Au moment de l'exécution, le résultat de l'opérateur instanceof est vrai si l'élément valeur de la RelationalExpression n'est pas nulle et que la référence peut être être coulée dans le ReferenceType sans soulever une ClassCastException. Sinon, le résultat est faux.

On peut donc en déduire que Java a quelque chose appelé null également, et ce type de nullité est contrôlé dans instanceof qui renvoie évidemment faux car il attend un type spécifique.

Il existe deux types de types dans le langage de programmation Java : les types primitifs et les types de référence. Selon Spécification Java sur les types et la valeur

Il existe également un type spécial null, le type de l'expression null, qui n'a pas de nom. Comme le type null n'a pas de nom, il est impossible de de déclarer une variable de type null ou d'effectuer un cast vers le type null. La référence null est la seule valeur possible d'une expression de type null. type. La référence nulle peut toujours subir un élargissement de référence vers n'importe quel type de référence.

À partir de Java 14, et plus particulièrement dans la version LTS de Java 17, nous disposons d'une fonction améliorée instanceof . Nous disposons d'une fonction de correspondance des modèles qui effectue des castings après les comparaisons de types.

Exemple

public static void main(String[] args) {
    Object testObject = "I am a string";
    List<Object> testList = null;
    if (testList instanceof List) {
        System.out.println("instance of list");
    } else {
        System.out.println("null type");
    }
    //Enhanced instanceof with type conversion - tested with JDK 17
    if (testObject instanceof String str) {
        System.out.println(str.toUpperCase());
    }
}

Sortie

null type
I AM A STRING

3voto

Marinos An Points 98
  • la vérification de la nullité n'est pas nécessaire before instanceof
  • la vérification de la nullité n'est pas nécessaire après instanceof qui valide à true

Les éléments suivants sont à sécurité nulle :

if(couldbenull instanceof Comparable comp){
   return comp.compareTo(somethingElse);
}

//java < 14
if(couldbenull instanceof Comparable){
   return ((Comparable)couldbenull).compareTo(somethingElse);
}

2voto

Android User Points 113

El instanceof n'a pas besoin d'être explicite null puisqu'il n'envoie pas de message d'erreur NullPointerException si l'opérande est null .

Au moment de l'exécution, le résultat de la instanceof L'opérateur est vrai si la valeur de l'expression relationnelle n'est pas null et la référence peut être transférée vers le type de référence sans que cela n'entraîne une exception de transfert de classe.

Si l'opérande est null le instanceof L'opérateur retourne false et donc, les vérifications explicites de nullité ne sont pas nécessaires.

Prenons 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");
         }  
}

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