KX
Messages postés16752Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 août 2024
-
18 mai 2022 à 20:17
L'informatique - science de l'information - consiste à créer, lire ou modifier des données.
Pour cela les langages de programmation donnent tous les outils nécessaires pour représenter en mémoire ces données et les manipuler. Mais il y a un cas particulier, la représentation de l'absence de données.
À un questionnaire, vous pourriez répondre : "Oui", "Non" ou "Je ne sais pas".
Le cas "Je ne sais pas" est ambiguë. Cela peut signifier :
vous ne le savez pas encore, mais vous le saurez quand vous en aurez vraiment besoin
vous auriez du le savoir, mais vous ne le savez pas alors que vous en avez besoin
vous ne l'avez jamais su, ne le saurez jamais et en soit ne pas le savoir est une réponse valable
Dans la plupart des langages ces trois cas sont modélisés de la même manière, avec la valeur particulière NULL. Il est cependant important de distinguer ces différents cas pour éviter bon nombre d'erreur, car il est impossible de traiter une donnée qui n'existe pas !
Remarque : selon le langage, la valeur NULL peut s'appeler ou s'écrire différemment (null, none, nil, etc.), cela ne change en rien son rôle dans le programme.
NULL comme valeur par défaut
Au démarrage du programme, les données n'existent pas encore, pourtant certaines variables décrites dans le code source sont déjà disponibles. Mais alors quelles seront leur valeur ?
Un grand nombre de langages (pas tous) donnent une valeur par défaut à ces variables, généralement 0 pour les types numériques et NULL pour les autres. Cela permet de garantir un certain déterminisme dans l'exécution du programme au cas où on utiliserait une variable en oubliant de l'initialiser.
Il faut se méfier des valeurs par défaut, car en soit, elles ne représentent aucune donnée spécifique au programme et les utiliser comme une donnée valide peut entraîner bon nombre d'erreurs fréquentes.
Les erreurs fréquentes avec NULL
NullPointerException en Java, NullReferenceException en C#, etc.
Chaque langage a sa propre manière de nommer l'erreur et pourtant il s'agit toujours du même problème : on essaye de manipuler une donnée qui n'existe pas. C'est à dire que la variable a pour valeur NULL et qu'il est donc impossible de la traiter comme une donnée normale.
Il s'agit la plupart du temps d'une erreur dans le code du programme, car on a oublié de traiter le cas particulier où la donnée que l'on manipule n'existe pas...
Pour corriger ces erreurs, il faut chercher à comprendre d'où vient la valeur NULL, c'est à dire trouver pourquoi la variable utilisée n'a pas la donnée que l'on souhaitait traiter et adapter son code pour prendre en compte ce cas particulier.
NULL comme donnée d'absence
Il arrive souvent d'utiliser la valeur NULL pour marquer explicitement qu'une donnée facultative est absente.
Par exemple, dans les bases de données, la valeur NULL a bien ce rôle de donnée absente, elle se manipule ainsi différemment des autres, avec notamment l'utilisation du test
IS NULL
, alors que la comparaison
= NULL
ne fonctionnera jamais, car on ne peut pas comparer une donnée avec une absence de donnée...
Avoir NULL comme valeur est le principal piège des développeurs, car si le NULL se propage dans le code il peut rapidement devenir source d'erreur. En effet s'il est facile de s'arranger pour que toutes les variables soient initialisées, il est en revanche plus difficile de se rappeler du critère facultatif de la donnée et ainsi oublier de traiter le cas où elle est absente.
Remarque : en JavaScript,
undefined
est la valeur par défaut des variables, qui marque l'inexistence de la donnée. Elle se distingue ainsi de la valeur
null
qui marque explicitement l'absence de la donnée. Ces deux valeurs pourront entraîner les mêmes erreurs si elles sont utilisées à la place d'une donnée valide.
Bonnes pratiques
Pour éviter au maximum les erreurs avec les valeurs NULL il vaudrait mieux utiliser à la place une valeur spécifique pour marquer l'absence de donnée que l'on pourra utiliser comme n'importe quelle autre donnée.
Par exemple, pour les nombre flottants, il existe la valeur particulière NaN ("Not a Number") qui permet d'attribuer une valeur au résultat d'un calcul mathématiques impossible (ex : la racine carré d'un nombre négatif).
Plus généralement certains langages ont des classes "Optional" qui peuvent soit être empty() soit une valeur non null. Dans ce cas on ne manipule jamais NULL mais un type de donnée que l'on sait pouvoir être vide et qui force le développeur à faire un contrôle systématique pour savoir si la valeur est présente ou non.