Will null instanceof SomeClass
retourner false
ou lancer un NullPointerException
?
Réponses
Trop de publicités?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
- 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);
}
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");
}
}
- Réponses précédentes
- Plus de réponses
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.