web-dev-qa-db-fra.com

Qu'est-ce qui est nul en Java?

Qu'est-ce que null?

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

À quel ensemble appartient null?

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

234
unj2

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

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

15.20.2 Opérateur de comparaison de type instanceof

_RelationalExpression:
    RelationalExpression instanceof ReferenceType
_

Au moment de l'exécution, le résultat de l'opérateur instanceof est true si la valeur de l'expression relationnelle n'est pas null et que la référence peut être Transformez en type ReferenceType sans déclencher une 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 "null" appartient-il?

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 type null n’a pas de nom, il est impossible de déclarer une variable du type null ou d’être converti en null type. La référence null 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 prétendre que null est simplement un littéral spécial pouvant être de n'importe quel type de référence.


Qu'est-ce qui est nul?

Comme le dit la citation JLS ci-dessus, dans la pratique, vous pouvez simplement prétendre qu'il s'agit "simplement d'un littéral spécial pouvant ê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 également cette propriété spéciale (de Java.lang.Object ):

public boolean equals(Object obj)

Pour toute valeur de référence non -nullx, x.equals(null) doit _return false_.

C'est également la 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 valeur par défaut lors de sa création:
    • Pour tous les types de référence, la valeur par défaut est null.

Comment cela est utilisé varie. Vous pouvez l'utiliser pour activer ce que l'on appelle l'initialisation lente des champs, où un champ aurait sa valeur initiale de null jusqu'à ce qu'il soit réellement utilisé, où il est remplacé par le valeur "réelle" (dont le calcul peut coûter cher).

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.

Ceci est un motif d'utilisation très courant: null est utilisé pour dénoter la non-existence d'un objet.

Voici un autre exemple d'utilisation, cette fois de Java.io.BufferedReader :

public String readLine() throws IOException

Retourne : Un String contenant le contenu de la ligne, sans caractères de fin de ligne, ou null si la fin du flux a été atteint.

Donc, ici, readLine() renverrait _instanceof String_ pour chaque ligne, jusqu’à ce qu’elle renvoie finalement un null pour indiquer 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épende pas de readLine() renvoyant null, mais on peut voir que cette conception présente 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 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 mappe ne contient aucun mappage pour la clé.

Si cette carte autorise les valeurs null, une valeur renvoyée de null n'indique pas nécessairement que la carte ne contient aucune correspondance pour la clé; il est également possible que la carte mappe explicitement la clé sur null. L'opération containsKey peut être utilisée pour distinguer ces deux cas.

Nous commençons à voir comment utiliser 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 instruction dit que même si la clé est mappée, null peut également être renvoyé.

En revanche, Java.util.Hashtable simplifie les choses en ne permettant pas les clés null et les valeurs; Sa 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é. N'oubliez pas qu'ils ne sont pas toujours les exemples de bonne pratique .

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

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

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

En Java? Aucune de vos préoccupations. Et c'est mieux gardé comme ça.


Est-ce que null est une bonne chose?

C'est maintenant subjectif à la limite. Certaines personnes disent que null provoque de nombreuses erreurs de programmation qui auraient pu être évitées. Certains disent que dans un langage qui intercepte NullPointerException comme Java, il est bon de l'utiliser parce que vous échouerez rapidement en cas d'erreur de programmation. Certaines personnes évitent null en utilisant motif d'objet nul , etc.

Il s’agit d’un vaste sujet en lui-même, il est donc préférable d’en débattre en tant que réponse à une autre question.

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

Je l'appelle mon erreur d'un milliard de dollars. C'était l'invention de la référence null 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 veiller à ce que toute utilisation des références soit absolument sûre, avec une vérification automatique par le compilateur. Mais je ne pouvais pas résister à la tentation de mettre une référence null, tout simplement parce que c'était si facile à mettre en œuvre. Cela a entraîné d'innombrables erreurs, vulnérabilités et pannes système, qui ont probablement causé des millions de dollars de douleur et de dommages au cours des quarante dernières années.

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

298
polygenelubricants

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

C'est pourquoi null instanceof X retournera 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. À proprement parler, l'affectation implique une conversion de type implicite; voir ci-dessous.)

À quel ensemble "null" appartient-il?

C'est le seul et unique membre du type null, le type null étant 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 Pour convertir 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 convertie en n'importe quel type de référence. En pratique, le programmeur peut ignorer le type null et prétendre que null est simplement un littéral spécial pouvant être de n'importe quel type de référence. "JLS 4.1

Qu'est-ce qui est nul?

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

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

Cela dépend de la mise en œuvre et vous ne pourrez pas voir la représentation de null dans un programme pur Java. (Mais null est représenté sous la forme d'une adresse/pointeur machine zéro dans la plupart sinon la totalité des implémentations Java.)

30
Stephen C

Qu'est-ce qui est nul?

Ce n'est rien.

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

Non, car ce n'est rien. Cela ne peut être l'instance d'aucune chose.

À quel ensemble appartient null?

Pas de set

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 de tas, de l’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 sur cet espace mémoire d'objet.

14
Sanjay Jain

Non, ce n'est l'instance de rien, instance de sera toujours faux.

9
Tom

Le mot clé null est un littéral qui représente une référence null 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: Java Glossaire

7
Adriaan Stander

Null en Java (tm)

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

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

En Java (tm), "null" n'est pas un mot clé, mais un littéral spécial du 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 nul n'a pas nécessairement la valeur zéro. Et il est impossible de transtyper vers le type null ou de déclarer une variable de ce type.

6
p27

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);
6
Thilo

Représentation du bytecode

La version null de Java prend en charge directement la machine virtuelle Java: trois instructions sont utilisées pour la mettre en œuvre:

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

Le chapitre 6 "Le Java Jeu d'instructions de la machine virtuelle" 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 la référence null spéciale, une référence à aucun objet, qui sera désignée ici par null. La référence null n'a initialement aucun type d'exécution, mais peut être transtypé en n'importe quel type. La valeur par défaut d'un type de référence est null.

null est une valeur spéciale, ce n'est pas une instance de rien. Pour des raisons évidentes, cela ne peut être instanceof rien.

4
fastcodejava

null est une valeur spéciale qui n'est une instance d'aucune 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);
   }
}
3
Itay Maman

null dans 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 nul en Java? Si non, je vous recommande d'apprendre des pointeurs en C/C++ et vous comprendrez.

Notez qu'en C, contrairement à C++, nullptr est indéfini, mais NULL est utilisé à la place, ce qui peut également être utilisé en C++ aussi, mais en C++, nullptr est préférable à NULL, car NULL en C est toujours associé aux pointeurs. Ainsi, en C++, le suffixe "ptr" a été ajouté à la fin du mot. De plus, toutes les lettres sont maintenant en minuscules, mais cela est moins important.

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

En C++, vous pouvez utiliser des pointeurs et la valeur nullptr pour facultatif 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, alors comment null dans Java peut être utilisé par exemple.

2
user2133061

Il existe deux grandes catégories de types en Java: primitive et référence. Variables déclarées d'une valeur de magasin de type primitif; 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". “X” stocke la référence de chaîne. C'est null ici. Tout d'abord, null n'est pas une instance d'objet valide, donc aucune mémoire ne lui est allouée. C'est simplement une valeur qui indique que la référence de l'objet ne fait pas référence à un objet.

1
Anand

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 le littéral null null, qui est formé à partir de ASCII caractères.

Un littéral nul est toujours du type nul.

Seule une référence de type affectée à null est allouée. Vous n'attribuez aucune valeur (objet) à la référence. Cette allocation est spécifique à la machine virtuelle Java: quelle sera la quantité de référence et dans quelle zone de mémoire elle sera allouée.

0
Oleksii Kyslytsyn

Une façon intéressante de voir null dans Java est, à mon avis, de le voir comme quelque chose qui NE dénote PAS une absence d'informations, mais simplement comme une valeur littérale pouvant être affectée à une référence de n'importe quel type. Si vous y réfléchissez si cela dénotait une absence d'information, alors pour que a1 == a2 soit vrai, cela n'a pas de sens (au cas où une valeur nulle leur serait assignée), car ils pourraient vraiment pointer vers UN objet (nous Je ne sais pas sur quels objets ils doivent pointer) ... Au fait, null == null renvoie true en Java. Si Java par exemple serait comme SQL: 1999 alors null == null renverrait 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
Bat0u89