Aujourd'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.
Utiliser
Il existe de nombreuses bibliothèques open source qui assument la lourde charge de tests pour Essayez de ne pas revenir
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
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éthodeequals()
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 a
et b
not null
), et pour cette raison, de nombreux programmeurs ne font pas attention aux objets qui sont appelés equals()
, y a
ou 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'appeltoString()
à une référence avec une valeur null
renvoie 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 null
return null
. Cela est particulièrement vrai pour les classes wrapper telles que Integer
, Float
, Double
ou 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 null
ou non.
Utiliser null
des 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 StringUtils
d’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 null
des 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 null
d'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 Collections
déclare spécifiquement des implémentations pratiques de listes, ensembles et dictionnaires vides : Collections.EMPTY_LIST
, Collections.EMPTY_SET
et Collections.EMPTY_MAP
. Par exemple:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
De même, vous pouvez Collections.EMPTY_SET
l' utiliser Collections.EMPTY_MAP
au lieu de renvoyer null
.
Utilisez les annotations @NotNull et @Nullable
Dans la description de vos méthodes, vous pouvez définirnull
des conventions de sécurité des méthodes à l'aide d'annotations @NotNull
et de @Nullable pour indiquer si une méthode peut retourner null
ou 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
, @Nullable
il sera plus facile pour le programmeur de comprendre où ajouter un chèque null
et 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 estnull
. 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 classeEmployee
ne peut pas être créé sans nom et id
sans numéro de téléphone. Dans ce cas, les objets Employee
sans 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 null
que d'appeler un numéro qui n'existe pas. Dans ce cas, disposer de conditions supplémentaires sur les champs qui le sont null
et 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 null
est 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 != null
du code du programme.
Utiliser le modèle d'objet nul
La création d'objets spéciauxNull
est 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 Iterator
utilisée pour parcourir la collection. Ensuite, si l'objet d'origine n'a pas d'itérateur, null
vous pouvez à la place renvoyer un Null
objet 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
GO TO FULL VERSION