JavaRush /Blog Java /Random-FR /Trucs et astuces. Comment éviter NullPointerException dan...
DarthVictor
Niveau 28

Trucs et astuces. Comment éviter NullPointerException dans les applications Java

Publié dans le groupe Random-FR
Trucs et astuces.  Comment éviter NullPointerException dans les applications Java - 1Aujourd'hui, je vais vous montrer des techniques simples pour éviter NullPointerException dans vos applications. Ils sont faciles à suivre, mais améliorent considérablement la fiabilité et la qualité de votre code. De plus, d’après mon expérience, le premier conseil aura un impact notable sur la qualité de votre code. Si vous connaissez d'autres astuces de programmation Java, n'hésitez pas à les partager dans les commentaires. Trucs et astuces.  Comment éviter NullPointerException dans les applications Java - 2

Appelez les méthodes equals() et equalsIgnoreCase() sur une chaîne littérale connue plutôt que sur un objet inconnu

Appelez toujours une méthode equals()sur une chaîne connue dont vous savez qu'elle ne l'est pas null. La méthode equals()est symétrique, c'est-à-dire qu'elle appelle a.equals(b)et b.equals(a)donnera le même résultat (if aet bnot null), et pour cette raison, de nombreux programmeurs ne font pas attention aux objets qui sont appelés equals(), y aou y b. L'un des effets secondaires de ceci est une NullPointerException si la méthode est appelée null.
Object unknownObject = null;

//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}
C’était l’astuce la plus simple pour éviter NullPointerException, mais elle apporte à elle seule une énorme amélioration car la méthode equals()se retrouve partout.

Choisissez valueOf() plutôt que toString() dans les cas où les deux produisent le même résultat

Puisque l'appel toString()à une référence avec une valeur nullrenvoie une NullPointerException, il est préférable d'utiliser l'appel valueOf()lorsque nous pouvons obtenir le même résultat, puisque l'appel valueOf()depuis nullreturn null. Cela est particulièrement vrai pour les classes wrapper telles que Integer, Float, Doubleou BigDecimal.
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Utilisez ces conseils lorsque vous n’êtes pas sûr qu’un objet puisse exister nullou non.

Utiliser nulldes méthodes et des bibliothèques sécurisées

Il existe de nombreuses bibliothèques open source qui assument la lourde charge de tests pour null. L’un des plus courants provient StringUtilsd’Apache Commons. En utilisant des méthodes telles que StringUtils.isBlank(), isNumeric(), isWhiteSpace()etc. vous n'avez pas à vous soucier de lancer une NullPointerException.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
Sortie : true true false false Et pourtant, avant utilisation, n'oubliez pas de lire la documentation nulldes méthodes et classes sûres. C'est une autre des meilleures astuces Java qui conduit à d'énormes améliorations sans nécessiter beaucoup d'efforts.

Essayez de ne pas revenir nulld'une méthode, il vaut mieux renvoyer une collection vide

C'est un autre bon conseil de programmation Java que Joshua Bloch décrit dans son livre Java : Effective Programming. Lorsque vous renvoyez des collections ou des tableaux vides, assurez-vous que l'appel des méthodes de base ressemble size()ou length()ne lève pas d'exception NullPointerException. La classe Collectionsdéclare spécifiquement des implémentations pratiques de listes, ensembles et dictionnaires vides : Collections.EMPTY_LIST, Collections.EMPTY_SETet Collections.EMPTY_MAP. Par exemple:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
De même, vous pouvez Collections.EMPTY_SETl' utiliser Collections.EMPTY_MAPau lieu de renvoyer null.

Utilisez les annotations @NotNull et @Nullable

Dans la description de vos méthodes, vous pouvez définir nulldes conventions de sécurité des méthodes à l'aide d'annotations @NotNullet de @Nullable pour indiquer si une méthode peut retourner nullou non. Les compilateurs et IDE modernes peuvent utiliser ces annotations pour analyser votre code et donner des conseils appropriés, par exemple, sur l'absence d'une vérification pour null, ou vice versa, sur la possibilité de supprimer une vérification inutile qui obstrue le code. De telles annotations, par exemple, sont prises en charge par l'IDE IntelliJ et FindBugs, et elles sont également incluses dans JSR 305. Mais même si votre IDE ne prend pas en charge de telles annotations, elles constitueront en elles-mêmes une bonne documentation. En regardant @NotNull, @Nullableil sera plus facile pour le programmeur de comprendre où ajouter un chèque nullet où pas. Il s'agit d'ailleurs d'une pratique relativement nouvelle parmi les programmeurs Java, et il faudra du temps pour qu'elle se propage.

Évitez l'autoboxing et l'autounboxing inutiles dans votre code

Non seulement cela conduit à la création d'objets temporaires inutiles, mais l'autoboxing peut également lever une NullPointerException si la classe wrapper est null. Par exemple, le code suivant lèvera une NullPointerException si l'entrée de personne ne contient pas de numéro de téléphone et renvoie null.
Person ram = new Person("ram");
int phone = ram.getPhone();
Lors de l'utilisation de l'autoboxing ou de l'autounboxing, non seulement les égalités, mais également les inégalités <peuvent >entraîner une NullPointerException.

Suivez les conventions et définissez des valeurs par défaut raisonnables.

L'un des meilleurs moyens d'éviter NullPointerException en Java est de déclarer et de suivre correctement les conventions de codage. La plupart des NullPointerExceptions se produisent lorsque vous essayez de créer un objet sans disposer de toutes les données et dépendances dont il a besoin. En empêchant la création d'objets inachevés en rejetant gracieusement de telles demandes, vous vous épargnerez un grand nombre d'exceptions NullPointerExceptions à l'avenir. De même, si vous autorisez la création d'objets, vous devez choisir une valeur par défaut raisonnable. Par exemple, un objet de classe Employeene peut pas être créé sans nom et idsans numéro de téléphone. Dans ce cas, les objets Employeesans numéro peuvent renvoyer zéro à la place null. Bien qu'un tel comportement de l'objet doive être réfléchi à l'avance, il peut être plus facile de le vérifier nullque d'appeler un numéro qui n'existe pas. Dans ce cas, disposer de conditions supplémentaires sur les champs qui le sont nullet ceux qui ne le sont pas aidera à prendre la bonne décision. En général, le choix entre planter immédiatement le programme ou l'attribuer nullest une décision de conception importante, et une fois que vous avez fait ce choix, vous devez le suivre de manière cohérente.

Définir des restrictions au niveau du SGBD

Lorsque vous utilisez une base de données pour stocker vos objets de programme, tels que les clients ou les commandes, il est judicieux de spécifier le «null ness » de vos objets au niveau du SGBD, en utilisant les restrictions de table appropriées. Les bases de données contiennent souvent des informations provenant de plusieurs sources, et l'introduction de vérifications des valeurs manquantes améliorera l'intégrité de vos données. De plus, la présence de contrôles null au niveau du SGBD les réduira dans votre code Java : en chargeant les données de la base de données dans les objets Java, vous pouvez être sûr de leur présence et supprimer les " " inutiles != nulldu code du programme.

Utiliser le modèle d'objet nul

La création d'objets spéciaux Nullest un autre moyen d'éviter NullPointerExcpetition en Java. Supposons qu'une méthode de notre application renvoie un objet avec lequel le programme travaille ensuite en appelant ses méthodes. Par exemple, la méthode Collection.iterator()renvoie un objet de la classe Iteratorutilisée pour parcourir la collection. Ensuite, si l'objet d'origine n'a pas d'itérateur, nullvous pouvez à la place renvoyer un Nullobjet spécial doté d'une méthode hasNext()qui renvoie toujours false. C'est tout, cher lecteur, c'est là que je termine mes conseils pour débarrasser les programmes Java des erreurs NullPointerException. Vous comprendrez à quel point ces règles simples et peu lourdes peuvent être utiles. Pour rappel, si vous souhaitez partager d'autres astuces NullPointerException dans les programmes Java, n'hésitez pas à le faire dans les commentaires. Traduit spécifiquement pour les étudiants JavaRush. Original
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION