Maison  >  Article  >  Java  >  Comment éviter NullPointerException en Java

Comment éviter NullPointerException en Java

黄舟
黄舟original
2017-09-07 10:31:111686parcourir

Cet article présente principalement les informations pertinentes sur le résumé des méthodes pour éviter NullPointerException (pointeur nul) en java. Les amis qui en ont besoin peuvent se référer au

Résumé des méthodes pour éviter NullPointerException (pointeur nul). ) en Java

Les exceptions de pointeur nul lancées dans les applications Java sont le meilleur moyen de résoudre les pointeurs nuls et sont également la clé pour écrire des programmes robustes qui fonctionnent correctement. Comme le dit le proverbe, « mieux vaut prévenir que guérir », cette phrase est également vraie pour une exception de pointeur nul aussi ennuyeuse. Heureusement, en appliquant certaines techniques de codage défensif et en suivant les connexions entre plusieurs parties de votre application, vous pouvez contrôler à un bon niveau les exceptions de pointeur nul en Java. BTW, ceci est le deuxième article de NullPointerException sur Javarevisited. Dans l'article précédent, nous avons discuté des causes courantes des exceptions de pointeur nul en Java, et dans ce didacticiel, nous apprendrons quelques conseils et bonnes pratiques de programmation Java. Ces conseils peuvent vous aider à éviter les exceptions de pointeur nul en Java. Suivre ces conseils peut également réduire le nombre de vérifications non nulles présentes dans votre code Java. En tant que programmeur Java expérimenté, vous connaissez probablement déjà certaines de ces techniques et les appliquez dans vos projets. Mais pour les développeurs débutants et intermédiaires, cela vaudra la peine d’être appris. À propos, si vous connaissez d'autres astuces Java pour éviter les exceptions de pointeur nul et réduire les vérifications de pointeur nul, partagez-les avec nous.

Ce sont des techniques simples, faciles à appliquer mais qui ont un impact significatif sur la qualité et la robustesse du code. D'après mon expérience, seule la première astuce améliore considérablement la qualité du code. Comme je l'ai déjà dit, si vous connaissez des astuces Java pour éviter les exceptions de pointeur nul et réduire les vérifications de pointeur nul, vous pouvez les partager en commentant cet article.

1) Appelez les méthodes equals() et equalsIgnoreCase() à partir d'objets String connus, et non d'objets inconnus.

Appelez toujours la méthode equals() à partir d'un objet String connu non nul. Parce que la méthode equals() est symétrique, appeler a.equals(b) et appeler b.equals(a) sont exactement les mêmes, c'est pourquoi les programmeurs sont si indifférents aux objets a et b. Si l'appelant est un pointeur nul, cet appel peut entraîner une NullPointerException


Object unknownObject = null;

//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}

//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}

Il s'agit de l'astuce Java la plus simple pour éviter NullPointerException, mais peut entraîner une énorme amélioration depuis equals() est une méthode courante.

2) Lorsque valueOf() et toString() renvoient le même résultat, préférez utiliser le premier.

Parce qu'appeler toString() sur un objet nul lèvera une exception de pointeur nul. Si nous pouvons utiliser valueOf() pour obtenir la même valeur, nous préférerions utiliser valueOf() et transmettre une valeur null à. valueOf() Renverra "null", en particulier dans les classes wrapper comme Integer, Float, Double et BigDecimal.


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"

3) Utilisez des méthodes et des bibliothèques null-safe Il existe de nombreuses bibliothèques open source qui font déjà le gros du travail de vérification des pointeurs nuls pour vous. L'un des plus couramment utilisés est StringUtils dans Apache commons. Vous pouvez utiliser StringUtils.isBlank(), isNumeric(), isWhiteSpace() et d'autres méthodes utilitaires sans vous soucier des exceptions de pointeur nul.


//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false

Mais avant de tirer une conclusion, n'oubliez pas de lire la documentation de la classe avec la méthode du pointeur nul. Il s'agit d'une autre bonne pratique Java qui peut être considérablement améliorée sans trop d'effort.

4) Évitez de renvoyer des pointeurs nuls à partir des méthodes, renvoyez plutôt une collection vide ou un tableau vide.

Cette bonne pratique ou astuce Java est mentionnée par Joshua Bloch dans son livre Effective Java. Ceci est une autre astuce pour améliorer votre programmation en Java. En renvoyant une collection ou un tableau vide, vous pouvez vous assurer que les appels tels que size() et length() ne planteront pas en raison d'une exception de pointeur nul. La classe Collections fournit des listes, des ensembles et des cartes vides pratiques : Collections.EMPTY_LIST, Collections.EMPTY_SET, Collections.EMPTY_MAP. Voici des exemples.


public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}

Vous pouvez également utiliser Collections.EMPTY_SET et Collections.EMPTY_MAP au lieu du pointeur nul.

5) Utilisez l'annotation@NotNull et @Nullable

lors de l'écriture d'un programme, vous pouvez définir s'il peut être un pointeur nul. Déclarez si une méthode est sécurisée pour les pointeurs nuls en utilisant des annotations telles que @NotNull et @Nullable. Les compilateurs, IDE ou outils modernes peuvent lire cette annotation et vous aider à ajouter des vérifications de pointeur nul que vous avez oubliées, ou vous proposer des vérifications de pointeur nul inutiles. IntelliJ et findbugs prennent déjà en charge ces annotations. Ces annotations font également partie de JSR 305, mais même si elles ne figurent pas dans l'EDI ou l'outil, l'annotation elle-même peut être utilisée comme documentation. En voyant @NotNull et @Nullable, le programmeur peut décider s'il doit effectuer une vérification du pointeur nul. À propos, cette technique est relativement nouvelle pour les programmeurs Java et son adoption prendra un certain temps.

6) Évitez les emballages et déballages automatiques inutiles dans votre code.

Indépendamment d'autres défauts tels que la création d'objets temporaires, si l'objet de classe wrapper est nul, l'encapsulation automatique peut également facilement provoquer une exception de pointeur nul. Par exemple, si l'objet personne n'a pas de numéro de téléphone, null sera renvoyé et le code suivant plantera en raison d'une exception de pointeur null.


Person ram = new Person("ram");
int phone = ram.getPhone();

当使用自动包装和自动解包的时候,不仅仅是等号,6d267e5fab17ea8bc578f9e7e5e1570b 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

7) 遵从Contract并定义合理的默认值。

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策

8)定义数据库中的字段是否可为空。

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

9) 使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。

这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn