Voir le flux RSS

Gugelhupf

[Actualité] [Java] Astuces pour éviter les NullPointerException

Note : 2 votes pour une moyenne de 5,00.
par , 01/05/2017 à 18h38 (1169 Affichages)
Une NullPointerException est une exception générée lorsque vous utilisez un objet qui n'est pas initialisé. Fort heureusement, c'est un type d'exception que nous pouvons facilement éviter.

Dans cet article, je vais vous montrer trois petites astuces pour éviter cette exception et rendre votre programme plus robuste.

Note : vous verrez ci-dessous un tableau à quatre colonnes, n'hésitez pas à utiliser votre curseur pour lire le contenu de la dernière colonne.

Cas Code pouvant générer une exception Astuce pour éviter l'exception Description de l'astuce
Vérification des paramètres en entrée de méthode
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void method(String param1, String param2) {
    //
    // Les paramètres en entrée
    // n'ont pas été testés.
    //
    //
    // Ils peuvent générer une
    // exception dans le noyau de l'API.
    //
    System.out.printf(
        "%s %s",
        param1.trim(),
        param2.trim()
    );
}
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void method(String param1, String param2) {
    Objects.requireNonNull(
        param1, 
        "``param1` ne doit pas être null"
    );
    Objects.requireNonNull(
        param2, 
        "``param2` ne doit pas être null"
    );
    System.out.printf(
        "%s %s",
        param1.trim(),
        param2.trim()
    );
}
La méthode Objects#requireNonNull(Object, String), introduite avec Java 7, lance une NullPointerException avant même que ce soit la JVM qui la détecte. C'est une technique de programmation défensive, cela vous permet en tant que créateur d'une API de lancer une exception à partir de la couche la plus haute que vous exposez à vos clients. L'exception ne sera donc pas générée à partir du noyau de votre API et vous éviterez ainsi de faire perdre du temps à vos clients en débogage.
Comparaison avec une instance qui ne peut pas être null
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
String s1 = null;
 
if (s1.equals("LABEL")) {
 
}
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
String s1 = null;
 
if ("LABEL".equals(s1)) {
 
}
Bien que cette syntaxe d'Object#equals() puisse ne pas vous paraitre « instinctive », elle vous évitera NullPointerException à coup sûr
Utilisation des listes
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
public List<String> method() {
    return null;
}
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
public List<String> method() {
    return new ArrayList<>();
}
Lorsque votre méthode retourne une liste d'éléments ou tout autre type de container (Collection, Map ...), faites en sorte de toujours retourner une liste vide au lieu de null si vous n'avez pas d'éléments. Vous éviterez ainsi d'avoir inutilement à tester vos listes avec un if avant de faire un for-each ou Collection#stream() ou Collection#iterator()

N'hésitez pas à lire mon article sur l'utilisation d'Optional<T> pour éviter d'utiliser explicitement le mot-clé null.

N'hésitez pas à lire les tutoriels de programmation orientée contrat et programmation défensive :

Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Viadeo Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Twitter Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Google Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Facebook Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Digg Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Delicious Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog MySpace Envoyer le billet « [Java] Astuces pour éviter les NullPointerException » dans le blog Yahoo

Mis à jour 05/05/2017 à 12h34 par ClaudeLELOUP

Catégories
Java , Programmation

Commentaires

  1. Avatar de eclesia
    • |
    • permalink
    Utiliser plutot Collections.EMPTY_LIST pour ne pas créer d'objet inutilement.

    Il y a aussi les @NotNull @Nonnull ...etc... dans divers projets de validation de contraintes.
  2. Avatar de mOuLi
    • |
    • permalink
    Citation Envoyé par eclesia
    Utiliser plutot Collections.EMPTY_LIST pour ne pas créer d'objet inutilement.
    Depuis Java5, il vaut même mieux privilégier Collections.emptyList() applicable aux listes avec génériques