Que sont les exceptions de pointeurs nuls (java.lang.NullPointerException
) et quelles en sont les causes ?
Quels méthodes/outils peuvent être utilisés pour déterminer la cause afin d'empêcher l'exception de provoquer la fin prématurée du programme ?
Les NullPointerException
sont des exceptions qui se produisent lorsque vous essayez d'utiliser une référence qui ne pointe vers aucun emplacement en mémoire (null) comme si elle faisait référence à un objet. Appeler une méthode sur une référence nulle ou essayer d'accéder à un champ d'une référence nulle déclenchera une NullPointerException
. Ce sont les plus courantes, mais d'autres façons sont listées sur la page javadoc [NullPointerException
][1].
L'exemple de code le plus rapide que je puisse trouver pour illustrer une NullPointerException
est probablement le suivant :
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
Sur la première ligne de main
, je donne explicitement à la référence Object
obj
la valeur null
. Cela signifie que j'ai une référence, mais qu'elle ne pointe vers aucun objet. Ensuite, j'essaie de traiter la référence comme si elle pointait vers un objet en appelant une méthode sur elle. Le résultat est une NullPointerException
car il n'y a pas de code à exécuter à l'endroit où la référence pointe.
(C'est un détail technique, mais je pense qu'il faut le mentionner : Une référence qui pointe vers null n'est pas la même chose qu'un pointeur C qui pointe vers un emplacement mémoire invalide. Un pointeur nul ne pointe littéralement aucun endroit, ce qui est subtilement différent de pointer vers un emplacement qui se trouve être invalide).
[1] : http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html
C'est comme si vous essayiez d'accéder à un objet qui est "nul". Considérez l'exemple ci-dessous :
TypeA objA;
Pour l'instant, vous venez de déclarer cet objet mais vous ne l'avez pas initialisé ou instancié. Et chaque fois que vous essayez d'accéder à une propriété ou à une méthode de cet objet, il lève une NullPointerException
, ce qui est logique.
Voyez aussi l'exemple ci-dessous :
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Un pointeur null
est un pointeur qui ne mène nulle part. Lorsque vous déréférencez un pointeur p
, vous dites "donnez-moi les données à l'emplacement stocké dans "p" ;. Lorsque p
est un pointeur null
, l'emplacement stocké dans p
est nowhere
, vous dites "donnez-moi les données à l'emplacement 'nowhere'" ;. Évidemment, il ne peut pas le faire, et il lève une exception de pointeur nul.
En général, c'est parce que quelque chose n'a pas été initialisé correctement.