243 votes

Qu'est-ce que null en Java?

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?

303voto

polygenelubricants Points 136838

Est-ce que null est une instance de quelque chose ?

Non, il n'y a pas de type qui null est un instanceof .

15.20.2 Opérateur de comparaison de types instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

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 .

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

JLS 4.1 Les types de types et de valeurs

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 site null est la seule valeur possible d'une expression de null type. Le site null 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 que null 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érence x , x.equals(null) devrait return false .

C'est aussi le valeur par défaut (pour les variables qui en ont) pour tous les types de référence :

JLS 4.12.5 Valeurs initiales des variables

  • 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, ou null 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 de null 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 site containsKey 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 :

  • État non initialisé
  • Condition de résiliation
  • Objet non existant
  • Une valeur inconnue

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.


Est 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 fonction null 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é.

31voto

Stephen C Points 255558

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

14voto

Sanjay Jain Points 1360

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.

9voto

Tom Points 13036

Non, ce n'est pas l'instance de quoi que ce soit, instanceof sera toujours faux.

7voto

astander Points 83138

Le mot clé null est un littéral qui représente une référence nulle, une référence qui ne se réfère à aucun objet. null est la valeur par défaut des variables de type référence.

Jetez peut-être un coup d'œil à

null : Glossaire Java

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