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?
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
esttrue
si la valeur de la relation expression n'est pasnull
et la référence pourrait être faite au ReferenceType sans soulever unClassCastException
. Sinon, le résultat estfalse
.
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érencenull
est la seule valeur possible de une expression du type null . La référencenull
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 quenull
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érencex
,x.equals(null)
devraitreturn 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, ounull
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 valeursnull
, alors une valeur de retour denull
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é denull
. L'opérationcontainsKey
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érencenull
, 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.
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.)
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.
Non, ce n'est pas l'instance de quoi que ce soit, instanceof sera toujours faux.
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 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.
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);
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.
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 dansObject o = null;
-
ifnull
etifnonnull
: p.ex. pour comparer un objet ànull
comme dansif (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.
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);
}
}
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.
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
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.
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é.