Java Language Piège - L'utilisation inutile de Wrappers primitifs peut mener à des exceptions NullPointerExceptions


Exemple

Parfois, les programmeurs qui sont de nouveaux Java utilisent des types et des encapsuleurs primitifs de manière interchangeable. Cela peut entraîner des problèmes. Considérez cet exemple:

public class MyRecord {
    public int a, b;
    public Integer c, d;
}

...
MyRecord record = new MyRecord();
record.a = 1;               // OK
record.b = record.b + 1;    // OK
record.c = 1;               // OK
record.d = record.d + 1;    // throws a NullPointerException

Notre classe MyRecord 1 repose sur une initialisation par défaut pour initialiser les valeurs sur ses champs. Ainsi, lorsque nous avons de new record, les a et b les champs seront mis à zéro, et les c et d les champs seront mis à null .

Lorsque nous essayons d'utiliser les champs initialisés par défaut, nous voyons que les champs int fonctionnent tout le temps, mais les champs Integer fonctionnent dans certains cas et pas dans d'autres. Spécifiquement, dans le cas où cela échoue (avec d ), ce qui se passe est que l'expression du côté droit tente de décomprimer une référence null , et c'est ce qui provoque la levée de l'exception NullPointerException .

Il y a plusieurs façons de regarder ceci:

  • Si les champs c et d doivent être des wrappers primitifs, alors nous ne devrions pas nous fier à l'initialisation par défaut, ou nous devrions tester null . Pour le premier est l'approche correcte, à moins qu'il y ait une signification précise pour les champs dans l'état null .

  • Si les champs ne doivent pas nécessairement être des enveloppes primitives, il est erroné de les transformer en enveloppes primitives. En plus de ce problème, les wrappers primitifs ont des surcharges supplémentaires par rapport aux types primitifs.

La leçon ici est de ne pas utiliser les types d’encapsuleurs primitifs, sauf si vous en avez vraiment besoin.


1 - Ce cours n’est pas un exemple de bonne pratique de codage. Par exemple, une classe bien conçue n'aurait pas de champs publics. Cependant, ce n'est pas le but de cet exemple.