Qu'est-ce que null en Java?

Qu'est-ce que null ?

est-ce que null est un exemple de quelque chose?

à quoi appartient null ?

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

213
demandé sur Joachim Sauer 2010-04-25 09:57:38

14 réponses

est null un exemple de quoi que ce soit?

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

15.20.2 De Type Opérateur De Comparaison instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

à l'exécution, le résultat de l'opérateur instanceof est true si la valeur de la relation expression n'est pas null et la référence pourrait être faite au ReferenceType sans soulever un ClassCastException . Sinon, le résultat est false .

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


à quel ensemble "null" appartient-il?

JLS 4.1 les types et les valeurs

il y a aussi un type spécial null , 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 du type null ou de mouler au type null . La référence null est la seule valeur possible de une expression du type null . La référence null peut toujours être moulée sur n'importe quel type de référence. En pratique, le programmeur peut ignorer le type null et juste 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 qui est nul?

comme le dit la citation de JLS ci - dessus, dans la pratique vous peut 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 les autres langues). Notez également que par contrat, il a également cette propriété spéciale (à partir de java.lang.Object ):

public boolean equals(Object obj)

pour tout non - null valeur de référence 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 composante de tableau est initialisée avec une valeur par défaut quand elle est créée:
    • 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 qu'on appelle initialisation paresseuse 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 coûteux à calculer).

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

public static Console console()

renvoie : la console du système, le cas échéant, autrement null .

il s'agit d'un schéma d'utilisation très courant: null est utilisé pour indiquer l'absence d'un objet.

voici un autre exemple d'usage, cette fois de java.io.BufferedReader :

public String readLine() throws IOException

Renvoie : Un String contenant le contenu de la ligne, à l'exclusion de toute ligne de terminaison des caractères, ou null si la fin du flux est 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() retour null , mais on peut voir que cette conception a l'avantage de rendre les choses concise. Notez qu'il n'y a aucun problème avec les lignes vides, car une ligne vide "" != null .

prenons un autre exemple, cette fois 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 pas de mappage de la clé.

null si cette carte permet des valeurs null , alors une valeur de retour de null n'indique pas nécessairement que la carte ne contient pas de cartographie pour la clé; il est également possible que la carte cartographie explicitement la clé de null . L'opération containsKey peut être utilisé 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 retourné. La deuxième déclaration dit que même si la clé est mappée, null peut aussi être retourné.

en contraste, java.util.Hashtable simplifie les choses en n'autorisant pas les clés null 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 à travers le reste des API et trouver où et comment null est utilisé. N'oubliez pas qu'il ne s'agit pas toujours des exemples de best practice .

en général, null sont utilisés comme valeur spéciale pour signifier:

  • état non Initialisé
  • condition de résiliation
  • objet Non existant
  • une valeur inconnue

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

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


est-ce une bonne chose?

C'est maintenant à la limite de la subjectivité. Certains disent que null provoque de nombreuses erreurs de programmation qui auraient pu être évitées. Certains disent que dans un langage qui capture NullPointerException comme Java, il est bon de l'utiliser parce que vous échouerez rapidement sur les erreurs de programmeur. Certaines personnes évitent null à l'aide de objet Nul motif , 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 la renommée de quicksort):

j'appelle ça mon erreur d'un milliard de dollars. il s'agit de l'invention de la référence null en 1965. À cette époque, je concevais le premier système de type complet pour les références dans un langage orienté objet (ALGOLW). Mon but était de m'assurer que toutes les références devrait être absolument sûr, avec la 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 que c'était si facile à mettre en œuvre. Cela a conduit à d'innombrables erreurs, vulnérabilités, et des accidents de 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 un recommandé regarder.

288
répondu polygenelubricants 2015-08-25 13:23:01

est null un exemple de quoi que ce soit?

Pas de. C'est pourquoi null instanceof X renvoie false pour toutes les classes X . (Ne vous laissez pas tromper par le fait que vous pouvez attribuer null à une variable dont le type est un type d'objet. À proprement parler, l'affectation implique une conversion de type implicite; voir ci-dessous.)

à quel ensemble appartient "null"?

c'est le seul et unique membre du type nul, où le type nul est défini comme suit:

" il y a aussi un type nul spécial, le type de l'expression null, qui n'a pas de nom. Parce que le type nul n'a pas de nom, il est impossible de déclarer une variable du type nul ou de lancer vers le type nul. La référence nulle est la seule valeur possible d'une expression de type null. La référence nulle peut toujours être moulée à n'importe quel type de référence. Dans pratique, le programmeur peut ignorer le type null et juste prétendre que null est simplement un littéral spécial qui peut être de n'importe quel type de référence." JLS 4.1

qu'est-ce qui est nul?

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?

qui 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 zéro dans la plupart sinon la totalité des implémentations Java.)

27
répondu Stephen C 2012-10-24 01:32:40

qu'est-ce qui est nul?

ce n'est rien.

est nul une instance de quelque chose?

Sans qu'il n'en est rien, Il ne peut pas être l'instance de toute chose.

à quel ensemble appartient null?

Pas toute

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

si certains points de référence à elle comme:

Object o=new Object();

dans la mémoire de tas un espace assigné à un nouvel objet créé. Et o indiquera l'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
répondu 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
répondu Tom 2010-04-25 06:00:24

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

peut - être aussi jeter un oeil à

null: Java Glossary

5
répondu Adriaan Stander 2010-04-25 06:08:18

Null en 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 du C/C++ lui-même.

en Java(tm)," null " n'est pas un mot-clé, mais un littéral spécial du type null. Il peut être moulé pour tout type de référence, mais pas à n'importe quel type primitif comme int ou booléen. La valeur littérale nulle n'a pas nécessairement la valeur zéro. Et il est impossible de lancer vers le type nul ou de déclarer une variable de ce type.

5
répondu p27 2011-05-06 07:11:48

Null n'est une instance d'aucune classe.

cependant, vous pouvez assigner 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
répondu Thilo 2010-04-25 06:15:09

null est une valeur spéciale, elle 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
répondu fastcodejava 2010-04-25 06:14:49

pseudo-code

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

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

Chapitre 6" Java Virtual Machine Instruction Set " mentionne ensuite les effets de null sur d'autres instructions: il lance un NullPointerException pour beaucoup d'entre eux.

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

d'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 nulle a d'abord pas de type run-time, mais peut être lancé sur n'importe quel type. La valeur par défaut d'un type de référence est nulle.

3

null est une valeur spéciale qui n'est pas une instance d'une classe. Cela 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
répondu Itay Maman 2010-04-25 06:03:26

null En Java est 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, puis-je vous recommande d'apprendre les pointeurs en C/C++ et alors vous comprendrez.

notez que dans C, contrairement à C++, nullptr n'est pas défini, mais NULL est utilisé à la place, qui peut aussi être utilisé dans C++ aussi, mais en C++ nullptr est plus préférable que juste NULL, parce que 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 aussi toutes les lettres sont maintenant en minuscules, mais c'est moins important.

en Java chaque variable de la classe de type non-primitive est toujours une référence à un objet de ce type ou hérité et null est une référence d'objet de classe nulle, mais pas un pointeur null, parce qu'en Java il n'y a pas une telle chose pointeur", mais les références aux objets de classe sont utilisées à la place, et null en Java est lié aux références d'objet de classe, donc vous pouvez 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, i.e. membre/variable qui n'a pas de valeur et si elle n'a pas de valeur alors elle est égale à nullptr, donc comment null En Java peut être utilisé par exemple.

1
répondu 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'information mais simplement comme une valeur littérale qui peut être assignée à une référence de n'importe quel type. Si vous y pensez, si cela dénote l'absence d'information, Alors pour a1==a2 être vrai n'a pas de sens (dans le cas où ils ont tous les deux été assignés 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)... Par la façon dont 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ée comme null dans les systèmes réels)... http://en.wikipedia.org/wiki/SQL

0
répondu Bat0u89 2013-11-28 19:55:57

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

String x = null;

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

0
répondu Anand 2017-01-29 19:33:50

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

3.10.7. Le Littéral Null

le type nul a une valeur, la référence nulle, représentée par le null literal null, qui est formé à partir de caractères ASCII.

Un littéral null est toujours de type null.

uniquement une référence du type qui est attribué à nul est attribué. Vous n'attribuez aucune valeur (objet) à la référence. Une telle allocation est spécifique à JVM combien de référence prendra et dans quelle zone de mémoire il sera alloué.

0
répondu Oleksii Kyslytsyn 2017-07-13 10:03:45