NullNull (nil dans certains langages) est une valeur, une constante ou un mot clé présent dans de nombreux langages informatiques, et qui désigne l'état d'un pointeur qui n'a pas de cible ou d'une variable qui n'a pas de valeur. La notion de valeur ou de pointeur NULL est en particulier présente dans les langages C et C++ (ainsi que dans plusieurs langages dont la syntaxe est proche, comme Java, JavaScript, PHP, et C#). En termes de bases de données, ce mot clef exprime le fait que la valeur d'une donnée n'est pas connue. Il ne s'agit donc pas d'une valeur mais de l'état dans lequel la donnée se trouve, et signifie l'absence de valeur. VariantesIl existe des équivalents nommés différemment :
C et C++En C, En C++, En C++11, le mot clef Voici un exemple de code montrant l'initialisation d'un pointeur à int a = 2; // Déclaration de la variable a de type int (entier) et initialisée avec 2
int *p = NULL; // Déclaration d'un pointeur sur un int qui vaut NULL
p = &a; // L'adresse de a est affectée au pointeur p
*p = 5; // p est déréférencé pour affecter 5 à la variable a
La valeur réellement utilisée comme pointeur nul par le processeur peut, sur certains systèmes, être différente de l’adresse spéciale 0 ; cela relève de la mécanique interne aux compilateurs[3]. Cependant au niveau du C, Différence avec NULBien que cela ne pose généralement pas de problème de compilation en C (car une conversion implicite a lieu), le pointeur NULL ne doit pas être confondu avec le caractère ASCII // Si l'on définit la constante NUL ainsi :
#define NUL '\0'
// Les deux chaînes suivantes sont équivalentes:
const char str1[] = "Hello";
const char str2[] = {'H','e','l','l','o',NUL};
const char vide[] = {NUL}; // équivaut à "".
const char *p = NULL; // p ne pointe sur rien.
p = vide; // p pointe vers le premier élément de la chaîne vide.
// Chaîne de caractères de longueur nulle : p[0] vaut NUL.
JavaLe langage Java ne permet pas l'emploi de pointeur mais de références. Le mot clé null définit une référence nulle, c'est-à-dire ne désignant aucun objet en mémoire. Il s'agit de la valeur par défaut des attributs de classe non initialisées de type référence d'objet. Voici un exemple de code montrant l'initialisation d'une référence à null, avant d'être utilisée pour référencer un objet alloué : Object source = null; // Déclaration d'une référence d'objet initialisée à null
source = new Object(); // Maintenant référencer un objet alloué dynamiquement en mémoire
La libération mémoire en Java n'est pas explicite et se fait par le ramasse-miettes qui tourne en tâche de fond pour libérer périodiquement les objets qui ne sont plus référencés.
Lors de la réallocation d'un tableau ou d'un objet très volumineux, il peut être utile de mettre une référence à int[] pixels = new int[1200*960]; // Ce premier tableau remplit presque toute la mémoire disponible.
pixels = null; // Permettra au ramasse-miettes de libérer la mémoire avant la création du tableau de la ligne ci-dessous.
pixels = new int[1980*1080]; // Ce nouveau tableau peut être créé, après la suppression du premier.
PHPEn php, une variable de valeur NULL est considérée comme non-définie : <?php
$a=NULL;
if(isset($a)) {
echo '$a est définie';
} else {
echo '$a est indéfinie';
}
if(is_null($a)) {
echo '$a est NULL';
} else {
echo '$a n\'est pas NULL';
}
if(isset($b)) {
echo '$b est défini';
} else {
echo '$b est indéfini';
}
if(is_null($b)) {
echo '$b est NULL';
} else {
echo '$b n\'est pas NULL';
}
Affiche : $a est indéfinie. $a est NULL $b est indéfini $b est NULL NULL, Typage et Méta-modélisationSoient deux types A et B distincts (et sans rapport) A a = null; B b = null; La modélisation correcte d'un système de types rendant ces deux affections valables implique que null possède un type sous-type union de A et B : None. None est un type singleton ayant comme seule valeur possible null défini comme l'union de tous les types du programme. Comme ce type n'est pas modélisable sans une forme spéciale du langage et que son utilité est limitée (il n'accepte qu'une seule valeur, null ), peu de langages à typage statique le proposent. Si on s'intéresse aux langages à objets, et qu'on pose comme première approximation du système de type : type = classe Alors la classe de null (étrangement tous ces langages utilisent plutôt la forme nil) devient la classe singleton None, sous-classe de toutes les classes ayant pour seule instance null. Pour garantir un fonctionnement cohérent avec le comportement des envois de messages sur null, toutes ces méthodes doivent être redéfinies par l'envoi d'une exception NullPointerException. Bien qu'en théorie la valeur null puisse être quelconque, en pratique tous les langages utilisent la valeur 0. Cette valeur est non adressable et toute tentative d'accès provoque une erreur de segmentation. Si l'on veut proprement lever une exception, on doit protéger tous les envois de messages par un test à null. Un bon compilateur ne génèrera pas ces tests dans les cas où le receveur est trivialement non null (cas des self, this, super et autres) et dans certains autres cas. Périphérique nulDans les systèmes UNIX, /dev/null est un fichier spécial qui détruit immédiatement toutes les données qui lui sont envoyées. Pour cette raison, ce fichier est appelé le « trou noir » ou encore la « poubelle ». Les systèmes d'exploitation Microsoft utilisent un fichier spécial appelé NUL: et plus récemment NUL. Articles connexesRéférences
|