Qu'est-ce que null en Java?


Qu'est-Ce que null?

Est null une instance de quelque chose?

À quel ensemble appartient null?

Comment est-il représenté dans la mémoire?

Author: Joachim Sauer, 2010-04-25

14 answers

Null est-il une instance de quelque chose?

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

15.20.2 Type Opérateur De Comparaison instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

Au moment de l'exécution, le résultat de la instanceof opérateur est true si la valeur de la RelationalExpression n'est pas null et la référence pouvant être exprimées à l' ReferenceType sans soulever un ClassCastException. Sinon, le résultat est false.

Cela signifie que pour tout type E et R, pour tout E o, où o == null, o instanceof R est toujours false.


À quel ensemble appartient 'null'?

JLS 4.1 Les types de types et de valeurs

Il existe également un type spécial null, le type de l'expression null, qui n'a pas de nom. Comme le typenull n'a pas de nom, il est impossible de déclarer une variable du typenull ou de la convertir ennull . Le null reference est la seule valeur possible d'une expression de type null. La référence null peut toujours être convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le typenull et prétendre simplement 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 null?

Comme le dit la citation 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 quelle référence type".

En Java, null == null (ce n'est pas toujours le cas dans d'autres langues). Notez également que par contrat, il a également cette propriété spéciale (de java.lang.Object):

public boolean equals(Object obj)

Pour toute valeur de référence non-null x, x.equals(null) devrait return false.

C'est aussi la valeur par défaut (pour les variables qui les 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ée avec une valeur par défaut lors de sa création:
    • Pour tous les types de référence, la valeur par défaut est null.

La façon dont cela est utilisé varie. Vous pouvez l'utiliser pour activer ce qui est appelé initialisation paresseuse{[79] } des champs, où un champ aurait sa valeur initiale de null jusqu'à ce qu'il soit réellement utilisé, où il est remplacé par la valeur "réelle" (qui peut être onéreux).

Il y a aussi d'autres utilisations. Prenons un exemple réel de java.lang.System:

public static Console console()

Renvoie: La console système, le cas échéant, sinon null.

C'est un usage très fréquent motif: null est utilisé pour désigner la non-existence d'un objet.

Voici un autre exemple d'utilisation, cette fois à partir de java.io.BufferedReader:

public String readLine() throws IOException

Retourne: Un String contenant le contenu de la ligne, à l'exclusion des caractères de terminaison de ligne, ou null si la fin du flux a été atteinte.

Donc ici, readLine() retournerait 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 sorte que la condition de terminaison ne dépend pas de readLine() retournant null, mais on peut voir que cette conception a l'avantage de faire 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 à partir de java.util.Map<K,V>:

V get(Object key)

Renvoie la valeur à laquelle la clé spécifiée est mappée, ou null si cette carte ne contient aucun mappage pour la clé.

Si cette carte autorise null valeurs, alors une valeur de retour de {[2] } n'indique pas nécessairement que la carte ne contient pas de mappage pour la clé; c'est aussi possible que la carte mappe explicitement la clé à null. L'opération containsKey peut être utilisée pour distinguer ces deux cas.

Ici, nous commençons à voir comment l'utilisation de null peut compliquer les choses. La première instruction 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, nullpeut aussi être retourné.

En revanche, java.util.Hashtable garde les choses plus simples en n'autorisant pas null clés et valeurs; son V get(Object key), si renvoie 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é. Ne gardez à l'esprit qu'ils ne sont pas toujours les meilleures pratiques exemples.

D'une manière générale, null sont utilisés comme valeur spéciale pour signifier:

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

Comment est-il représenté dans la mémoire?

En Java? Aucun de vos préoccupations. Et c'est mieux gardé de cette façon.


Est null une bonne chose?

Ceci est maintenant subjectif limite. Certaines personnes disent que null provoque de nombreuses erreurs de programmeur 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 de programmeur. Certaines personnes évitent null en utilisant objet Null modèle, etc.

C'est un sujet énorme en soi, il est donc préférable de le discuter comme réponse à une autre question.

Je terminerai par une citation de l'inventeur de null lui-même, C. A. R Hoare (de renommée quicksort):

J'appelle ça mon erreur d'un milliard de dollars. C'était l'invention de la référence null en 1965. A cette époque, je concevais le premier système de type complet pour les références dans un langage orienté objet (ALGOL W). Mon but était de assurez-vous que toute utilisation des références doit être absolument sûre, avec une vérification effectuée automatiquement par le compilateur. Mais je n'ai pas pu résister à la tentation de mettre une référence null, simplement parce qu'elle était si facile à implémenter. Cela a conduit à d'innombrables erreurs, vulnérabilités et plantages du système, qui ont probablement causé un milliard de dollars de douleur et de dommages au cours des quarante dernières années.

La vidéo de cette présentation va plus loin; c'est une montre recommandée.

 288
Author: polygenelubricants, 2015-08-25 13:23:01

Null est-il une instance de quelque chose?

Non. C'est pourquoi null instanceof X sera de retour false pour toutes les classes X. (Ne vous laissez pas berner par le fait que vous pouvez affecter null à une variable dont le type est un type d'objet. Strictement parlant, l'affectation implique une conversion de type implicite; voir ci-dessous.)

À quel ensemble appartient 'null'?

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. Comme le type null n'a pas de nom, il est impossible de déclarer une variable du type null ou de la convertir en type null. La référence nulle est la seule valeur possible d'une expression de type null. La référence null peut toujours être convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le type null et simplement prétendre que null est simplement un littéral spécial qui peut être de tout type de référence." JLS 4.1

Qu'est-ce que null?

Voir ci-dessus. Dans certains contextes, null est utilisé pour désigner "aucun objet" ou "inconnu" ou "indisponible", mais ces significations sont spécifiques à l'application.

Comment est-il représenté dans la 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 machine zéro dans la plupart, sinon toutes les implémentations Java.)

 27
Author: Stephen C, 2012-10-24 01:32:40

Qu'est-ce que null?

Ce n'est rien.

Null est-il une instance de quelque chose?

Non comme ce n'est rien, Cela ne peut être une instance de rien.

À quel ensemble appartient null?

Aucun ensemble

Comment est-il représenté dans la mémoire?

Si certains points de référence comme:

Object o=new Object();

Dans la mémoire du tas, un espace attribué au nouvel objet créé. Et o pointera vers cet espace assigné en mémoire.

Maintenant o=null;

Cela signifie maintenant que o ne pointera pas vers cet espace mémoire de l'objet.

 13
Author: Sanjay Jain, 2011-08-31 14:31:01

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

 8
Author: Tom, 2010-04-25 06:00:24

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

Aussi peut-être jeter un oeil à

Null: Glossaire Java

 5
Author: Adriaan Stander, 2010-04-25 06:08:18

Null dans Java(tm)

En C et C++, "NULL" est une constante définie dans un fichier d'en-tête, avec une valeur comme:

    0

Ou:

    0L

Ou:

    ((void*)0)

En fonction des options du compilateur et du modèle de mémoire. NULL ne fait pas, à proprement parler, partie de C/C++ lui-même.

En Java(tm), "null" n'est pas un mot-clé, mais un littéral spécial de type null. Il peut être converti en n'importe quel type de référence, mais pas en n'importe quel type primitif tel que int ou boolean. Le littéral null ne le fait pas nécessairement la valeur zéro. Et il est impossible de convertir le type null ou de déclarer une variable de ce type.

 5
Author: p27, 2011-05-06 07:11:48

Null n'est pas une instance de classe.

Cependant, vous pouvez affecter null à des variables de n'importe quel type (objet ou tableau):

 // this is false   
 boolean nope = (null instanceof String);

 // but you can still use it as a String
 String x = null;
 "abc".startsWith(null);
 4
Author: Thilo, 2010-04-25 06:15:09

null est une valeur spéciale, ce n'est pas une instance de quoi que ce soit. Pour une raison évidente, il ne peut pas être instanceof quoi que ce soit.

 3
Author: fastcodejava, 2010-04-25 06:14:49

Représentation du bytecode

Java null a un support JVM direct: trois instructions sont utilisées pour l'implémenter:

  • aconst_null: par exemple, pour définir une variable de null, comme dans Object o = null;
  • ifnull et ifnonnull: par exemple pour comparer un objet à null, comme dans if (o == null)

Le chapitre 6 "Le jeu d'instructions de la machine virtuelle Java" mentionne ensuite les effets de null sur d'autres instructions: il lance un NullPointerException pour beaucoup d'entre elles.

2.4. "Types et valeurs de référence" mentionne également null en termes génériques:

Une valeur de référence peut également être nulle référence, une référence à aucun objet, qui sera notée ici par null. La référence null n'a initialement aucun type d'exécution, mais peut être convertie en n'importe quel type. La valeur par défaut d'un type de référence est nulle.

null est une valeur spéciale qui n'est pas une instance d'une classe. Ceci est illustré par le programme suivant:

public class X {
   void f(Object o)
   { 
      System.out.println(o instanceof String);   // Output is "false"
   }
   public static void main(String[] args) {
      new X().f(null);
   }
}
 2
Author: Itay Maman, 2010-04-25 06:03:26

Null en Java est similaire/similaire à nullptr en C++.

Programme en C++:

class Point
{
    private:
       int x;
       int y;
    public:
       Point(int ix, int iy)
       {
           x = ix;
           y = iy;
       }
       void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
    Point* p = new Point(3,5);
    if (p != nullptr)
    {
       p->print();
       p = nullptr;
    }
    else
    {
        std::cout << "p is null" << std::endl;
    }
    return 0;
}

Même programme en Java:

public class Point {
    private int x;
    private int y;
    public Point(int ix, int iy) {
        x = ix;
        y = iy;
    }
    public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
    public static void main(String[] args) {
        Point p = new Point(3,5);
        if (p != null)
        {
            p.print();
            p = null;
        }
        else
        {
            System.out.println("p is null");
        }
    }
}

Maintenant, comprenez-vous à partir des codes ci-dessus ce qui est null en Java? Si non, je vous recommande d'apprendre des pointeurs en C / C++ et vous comprendrez.

Notez qu'en C, contrairement à C++, nullptr n'est pas défini, mais NULL est utilisé à la place, ce qui peut également être utilisé en C++, mais en C++ nullptr est plus préférable que simplement NULL, car le NULL en C est toujours lié aux pointeurs et c'est tout, donc en C++ le suffixe "ptr" a été ajouté à la fin du mot, et toutes les lettres sont maintenant en minuscules, mais c'est moins important.

En Java, chaque variable de classe de type non primitive fait toujours référence à un objet de ce type ou hérité et null est une référence d'objet de classe null, mais pas un pointeur null, car en Java il n'y a pas de "pointeur", mais les références aux objets de classe sont utilisées à la place, et null références, vous pouvez donc aussi l'appeler "nullref" ou "nullrefobj", mais c'est long, alors appelez-le simplement "null".

En C++, vous pouvez utiliser des pointeurs et la valeur nullptr pour optionnel membres/variables, c'est-à-dire membre/variable qui n'a pas de valeur et s'il n'a pas de valeur, il est égal à nullptr, donc comment null en Java peut être utilisé par exemple.

 1
Author: Farewell Stack Exchange, 2017-08-15 12:31:11

Une façon intéressante de voir null en java à mon avis est de le voir comme quelque chose qui ne dénote PAS une absence d'informations mais simplement comme une valeur littérale qui peut être affectée à une référence de tout type. Si vous y pensez si cela dénotait l'absence d'informations, alors pour a1==a2 être vrai n'a pas de sens (au cas où ils auraient tous deux reçu une valeur de null) car ils pourraient vraiment pointer vers N'importe QUEL objet (nous ne savons tout simplement pas quels objets ils devraient pointer)... Au fait null = = null renvoie true en java. Si java par exemple serait comme SQL:1999 alors null==null retournerait unknown (une valeur booléenne dans SQL:1999 peut prendre trois valeurs : true,false et unknown mais dans la pratique unknown est implémenté comme null dans les systèmes réels)... http://en.wikipedia.org/wiki/SQL

 0
Author: Bat0u89, 2013-11-28 19:55:57

, Il existe deux grandes catégories de types en Java: primitive et référence. Les variables déclarées d'un type primitif stockent les valeurs; les variables déclarées d'un type de référence stockent les références.

String x = null;

Dans ce cas, l'instruction d'initialisation déclare une variable "x". "x" stocke la référence de chaîne. Il est null ici. Tout d'abord, null n'est pas une instance d'objet valide, il n'y a donc pas de mémoire allouée pour cela. C'est une valeur qui indique que l'objet la référence ne fait actuellement pas référence à un objet.

 0
Author: Anand, 2017-01-29 19:33:50

Réponse courte et précise qui répond formellement à toutes vos questions de JLS:

3.10.7. Le littéral Nul

Le type null a une valeur, la référence null, représentée par null littéral null, qui est formé à partir de caractères ASCII.

Un littéral null est toujours de type null.

Seule une référence de type affectée à null est allouée. Vous n'attribuez aucune valeur (objet) à la référence. Tel l'allocation est spécifique à la JVM combien de référence prendra et dans quelle zone de mémoire elle sera allouée.

 0
Author: Oleksii Kyslytsyn, 2017-07-13 10:03:45