【问题标题】:Handle null pointer exception处理空指针异常
【发布时间】:2021-11-08 13:56:05
【问题描述】:

我有以下代码:

String a= null
Element element = ...
if(element == null) {
   System.out.println("...");
}
a = element.getText();

我在这段代码中遇到了一个空指针异常。 我认为最好使用 if else 语句以避免此错误。

String a= null
Element element = ...
if(element == null) {
   System.out.println("...");
} else {
   a = element.getText();
}

使用上面的代码解决问题是一个好的解决方案还是用另一种方式管理它会更好?

【问题讨论】:

  • 第二种方法正确地处理了避免element 的 NPE 的情况。但是,您需要进一步考虑的是,如果 elementnulla 可能是 null
  • 空值有破坏代码的趋势,因为您根本不能将它用作对象。您可能会发现,尽可能避免使用空值的样式编码是有益的。 Java 已经添加了一些库来帮助您,但它并没有强制执行它。如果您需要包装器,请查看 Optional。
  • 对所显示代码的注释(与您的问题没有直接关系):如果elementnullSystem.out.println("..."); 可能意味着错误消息。抛出异常可能是更好的选择。

标签: java nullpointerexception


【解决方案1】:

是的,由于其他答案已经提到的原因,这是一个解决方案。我想提供另一种解决方案:

String a;
try {
    Element element = ...;
    a = element.getText();
} catch (NullPointerException e) {
    System.out.println("...");
    a = null; // Or some other value that can be tested but cannot produce a NPE
}

这将与您的 if 语句具有相同的错误处理,但它的优点是以后不能引用“元素”并在其他地方产生 NPE。这当然只有在 String 不能以任何一种方式产生 NPE 并且 Element 可以在以后实际使用时(换句话说,如果该方法之后没有直接结束)才有用。

【讨论】:

    【解决方案2】:

    你的方法没问题,因为它有效,你不再得到 NPE。

    您可以反转 if 条件并简化以下内容:

    String a= null
    Element element = ...
    if(element != null) {
       a = element.getText();
    } 
    

    这样你在受保护的代码块中做你的事情,你不需要else部分,除非你真的想打印“...”

    【讨论】:

      【解决方案3】:

      这段代码出现空指针异常

      是的,因为如果element == null,您不执行element.getText()

      Element element = ...
      if(element == null) {           // This check is irrelevant to...
         System.out.println("...");
      }
      a = element.getText();          // ...whether this statement is executed.
      

      这是一个好的解决方案

      这是一个解决方案,因为element == null时不会执行else

      您可能会考虑反转条件,因此“快乐”的情况(当事情正常工作时您想要执行的情况)首先出现。但这在功能上并不是重要的区别。

      if(element != null) {
         a = element.getText();
      } else {
         System.out.println("...");
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        相关资源
        最近更新 更多