Qu'est-ce que null
?
null
est-il une instance de quelque chose?
A quelle ensemble appartient null
?
Comment est-il représenté en mémoire?
Qu'est-ce que null
?
null
est-il une instance de quelque chose?
A quelle ensemble appartient null
?
Comment est-il représenté en mémoire?
Est-ce que null est une instance de quelque chose ?
Non, il n'y a pas de type qui null
est un instanceof
.
instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
Au moment de l'exécution, le résultat de la
instanceof
L'opérateur esttrue
si la valeur de la Expression relationnelle n'est pasnull
et la référence pourrait être coulée dans le Type de référence sans soulever unClassCastException
. Sinon, le résultat estfalse
.
Cela signifie que pour tout type E
y R
pour tout E o
, donde o == null
, o instanceof R
est toujours false
.
A quel jeu appartient "null" ?
Il y a également une null type, le type de l'expression
null
qui n'a pas de nom. Parce que le null n'a pas de nom, il est impossible de déclarer une variable de type null ou pour effectuer un transfert vers le type null type. Le sitenull
est la seule valeur possible d'une expression de null type. Le sitenull
peut toujours être convertie en n'importe quel type de référence. Dans la pratique, le programmeur peut ignorer le null et prétendre quenull
est simplement un littéral spécial qui peut être de n'importe quel type de référence.
Qu'est-ce que la nullité ?
Comme le dit la citation de JLS ci-dessus, en pratique, vous pouvez simplement prétendre que c'est "simplement un littéral spécial qui peut être de n'importe quel type de référence".
En Java, null == null
(ce n'est pas toujours le cas dans d'autres langues). Notez également que par contrat, il possède aussi cette propriété spéciale (de java.lang.Object
):
public boolean equals(Object obj)
Pour toute personne non
null
valeur de référencex
,x.equals(null)
devraitreturn false
.
C'est aussi le valeur par défaut (pour les variables qui en ont) pour tous les types de référence :
- Chaque variable de classe, variable d'instance ou composant de tableau est initialisé avec une variable de type valeur par défaut lors de sa création :
- Pour tous les types de référence, la valeur par défaut est
null
.
L'utilisation qui en est faite varie. Vous pouvez l'utiliser pour activer ce que l'on appelle Initialisation paresseuse de champs, où un champ aurait sa valeur initiale de null
jusqu'à ce qu'il soit effectivement utilisé, où il est remplacé par la valeur "réelle" (qui peut être coûteuse à calculer).
Il existe également d'autres utilisations. Prenons un exemple concret de java.lang.System
:
public static Console console()
Renvoie à : La console du système, le cas échéant, sinon
null
.
Il s'agit d'un modèle d'utilisation très courant : null
est utilisé pour indiquer la non-existence d'un objet.
Voici un autre exemple d'utilisation, cette fois-ci tiré de l'ouvrage suivant java.io.BufferedReader
:
public String readLine() throws IOException
Renvoie à : A
String
contenant le contenu de la ligne, à l'exclusion de tout caractère de fin de ligne, ounull
si la fin du flux a été atteinte.
Donc ici, readLine()
rendrait instanceof String
pour chaque ligne, jusqu'à ce qu'il renvoie finalement un null
pour signifier la fin. Cela vous permet de traiter chaque ligne comme suit :
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
On peut concevoir l'API de manière à ce que la condition de terminaison ne dépende pas de l'élément suivant readLine()
en retournant sur null
mais on peut voir que cette conception a l'avantage de rendre les choses concises. Notez qu'il n'y a pas de problème avec les lignes vides, car une ligne vide "" != null
.
Prenons un autre exemple, cette fois-ci de la part de java.util.Map<K,V>
:
V get(Object key)
Retourne la valeur à laquelle la clé spécifiée est associée, ou
null
si cette carte ne contient aucun mappage pour la clé.Si cette carte permet
null
alors une valeur de retour denull
n'indique pas nécessairement que la carte ne contient aucun mappage pour la clé ; il est également possible que la carte mappe explicitement la clé ànull
. Le sitecontainsKey
peut être utilisée pour distinguer ces deux cas.
Nous commençons ici à voir comment l'utilisation de null
peut compliquer les choses. La première déclaration dit que si la clé n'est pas mappée, null
est renvoyé. La deuxième déclaration dit que même si la clé est mappée, null
peut également être renvoyé.
En revanche, java.util.Hashtable
simplifie les choses en n'autorisant pas null
et les valeurs ; son V get(Object key)
si le retour se fait null
signifie sans ambiguïté que la clé n'est pas mappée.
Vous pouvez lire le reste des API et trouver où et comment null
est utilisé. Gardez à l'esprit qu'ils ne sont pas toujours les meilleurs. meilleure pratique exemples.
D'une manière générale, null
sont utilisés comme une valeur spéciale pour signifier :
Comment est-elle représentée dans la mémoire ?
En Java ? Cela ne vous regarde pas. Et il vaut mieux que ça reste ainsi.
null
une bonne chose ?Ceci est maintenant à la limite du subjectif. Certaines personnes disent que null
provoque de nombreuses erreurs de programmation qui auraient pu être évitées. Certains disent que dans un langage qui attrape NullPointerException
comme Java, il est bon de l'utiliser car vous échouerez rapidement sur les erreurs du programmeur. Certaines personnes évitent null
en utilisant Modèle d'objet nul etc.
Il s'agit d'un vaste sujet en soi, qu'il est donc préférable d'aborder en réponse à une autre question.
Je terminerai par une citation de l'inventeur des null
lui-même, C.A.R Hoare (de la renommée de quicksort) :
J'appelle ça mon erreur à un milliard de dollars. C'est l'invention de la
null
référence en 1965. À l'époque, je concevais le premier système de types complet pour les références dans un langage orienté objet (ALGOL W). Mon objectif était de faire en sorte que toute utilisation de références soit absolument sûre, la vérification étant effectuée automatiquement par le compilateur. Mais je n'ai pas pu résister à la tentation d'ajouter une fonctionnull
simplement parce qu'elle était très facile à mettre en œuvre. Cela a conduit à d'innombrables erreurs, vulnérabilités et pannes de système, qui ont probablement causé un milliard de dollars de souffrance et de dommages au cours des quarante dernières années.
El vidéo de cette présentation va plus loin ; c'est un regard recommandé.
Est-ce que null est une instance de quoi que ce soit ?
Non. C'est pourquoi null instanceof X
renverra false
pour toutes les classes X
. (Ne vous laissez pas tromper par le fait que vous pouvez assigner null
à une variable dont le type est un type objet. Strictement parlant, l'assignation implique une conversion de type implicite ; voir ci-dessous.)
À quel ensemble 'null' appartient-il ?
C'est le seul et unique membre du type null, où le type null est défini comme suit :
"Il existe également un type null spécial, le type de l'expression null, qui n'a pas de nom. Parce que le type null n'a pas de nom, il est impossible de déclarer une variable de type null ou de caster vers le type null. La référence null est la seule valeur possible d'une expression de type null. La référence null peut toujours être castée vers n'importe quel type de référence. En pratique, le programmeur peut ignorer le type null et prétendre simplement que null est simplement une valeur spéciale qui peut être de n'importe quel type de référence." JLS 4.1
Qu'est-ce que null ?
Voir ci-dessus. Dans certains contextes, null
est utilisé pour signifier "pas d'objet" ou "inconnu" ou "non disponible", mais ces significations sont spécifiques à l'application.
Comment est-il représenté en mémoire ?
C'est spécifique à l'implémentation, et vous ne pourrez pas voir la représentation de null
dans un programme Java pur. (Mais null
est représenté comme une adresse / pointeur de machine nulle dans la plupart, sinon dans toutes les implémentations Java.)
Qu'est-ce que null?
C'est rien.
Null est-il une instance de quelque chose?
Non, comme c'est rien, il ne peut être une instance de quoi que ce soit.
À quel ensemble null appartient-il?
Aucun ensemble
Comment est-il représenté en mémoire?
Si une référence pointe vers lui comme:
Object o = new Object();
Dans la mémoire heap, un espace est attribué au nouvel objet créé. Et o pointera vers cet espace attribué en mémoire.
Maintenant o = null;
Cela signifie que maintenant o ne pointera plus vers cet espace mémoire de l'objet.
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.