Comment éviter l'exception de pointeur nul en Java?

Comment éviter les exceptions de pointeur null en Java est également un problème souvent rencontré lorsqu'un programmeur junior devient un programmeur intermédiaire.

Les programmeurs ne connaissent pas ou ne font pas confiance aux conventions utilisées et prennent soin de vérifier les valeurs nulles. De plus, lorsque les programmeurs écrivent du code, ils s'appuient toujours sur le retour de NULL pour indiquer une signification, de sorte que l'appelant doit rechercher Null.

Il existe deux scénarios de vérification de pointeur nul :

  1. Le résultat attendu est nul.
  2. Le résultat attendu n'est pas nul.

La seconde est très simple, vous pouvez utiliser assert ou autoriser le programme à signaler des erreurs, comme lancer NullPointerException. Assertions est une fonctionnalité très inutilisée ajoutée à partir de Java 1.4, la syntaxe est :

assert <condition>
复制代码

ou

assert <condition> : <object>
复制代码

condition est une expression booléenne et object est un objet (la sortie de sa méthode toString() sera incluse dans l'erreur).

Note de relecture : je l'ai testé, JDK1.4 et supérieur, définissez le paramètre vm -ea avant de l'exécuter

public static void main(String[] args) {String name = null;assert (name != null) : "name为空null";}
Exception in thread "main"; java.lang.AssertionError: 变量name为空nullat LogUtil.main(LogUtil.java:37)
复制代码

Si la condition est fausse, assert lèvera une erreur (AssertionError). Par défaut, Java ignore les assertions. Vous pouvez activer les assertions en transmettant un paramètre -ea à la JVM.

Vous pouvez activer et désactiver les assertions pour un seul package ou une seule classe. Cela signifie que vous pouvez valider votre code avec des assertions pendant le développement et les tests, et le désactiver lors de l'expédition en production, bien que les tests que je montre ci-dessous ne perdent pas de performances en raison des assertions. Il est normal de ne pas avoir d'assertion dans ce segment de code, car cela échouera, tout comme l'ajout d'une assertion. La seule différence est qu'avec les assertions, cela peut se produire plus rapidement, avoir plus de sens et joindre des informations supplémentaires qui peuvent vous aider à comprendre pourquoi cela a échoué.

Le premier est un peu plus délicat. Si vous n'avez pas le contrôle sur le code qui est appelé, alors vous êtes bloqué. Si Null est une valeur de retour raisonnable, vous devez la vérifier. Si c'est du code que vous pouvez contrôler, c'est une toute autre histoire. Essayez d'éviter d'utiliser NULL comme valeur de retour. Pour les collections qui renvoient Collections, il est facile de renvoyer Empty (une collection ou un tableau vide), au lieu de toujours utiliser null comme valeur de retour. C'est un peu plus compliqué pour les méthodes qui ne renvoient pas de Collections. Considérez l'exemple suivant :

public interface Action {
  void doSomething();}public interface Parser {
  Action findAction(String userInput);}
复制代码

Parser采用用户的输入作为参数,然后做一些事情(例如模拟一个命令行)。现在你可能会返回null,如果没找到对应输入的动作的话,这就导致了刚才说过的空指针检查。

一个可选的解决方案是永远不要返回null,而是返回一个空对象

public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };

  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }}
复制代码

比较这段代码:

Parser parser = ParserFactory.getParser();if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response}Action action = parser.findAction(someInput);if (action == null) {
  // do nothing} else {
  action.doSomething();}
复制代码

和这段:

ParserFactory.getParser().findAction(someInput).doSomething();
复制代码

这是个更好的设计,因为足够简洁,避免了多余的判断。

即便如此,或许比较合适的设计是:findAction()方法之恶杰抛出一个异常,其中包含一些有意义的错误信息—–特别是在这个案例中你依赖于用户的输入。

让findAction()方法抛出一个异常而不是简单的产生一个没有任何解释的NullPointerException 要好得多。

try {
    ParserFactory.getParser().findAction(someInput).doSomething();} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());}
复制代码

或者你认为try/catch 的机制太丑了,你的action应该跟用户提供一个反馈而不是什么都不做:

public Action findAction(final String userInput) {
    /* Code to return requested Action if found */
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: " + userInput);
        }
    }}
复制代码

Java学习视频分享

Java基础:

Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受

Java项目:

【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏

【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发

Je suppose que tu aimes

Origine juejin.im/post/7078234903019536420
conseillé
Classement