编程语言
首页 > 编程语言> > Avoiding NullPointerException in Java | Java Debug 笔记

Avoiding NullPointerException in Java | Java Debug 笔记

作者:互联网

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

提问:Avoiding NullPointerException in Java?

如我用了很多来避免NPE。object != null

什么是替代:

if (someobject != null) {
    someobject.doCalc();
}
复制代码

高分回答:

在我看来,这听起来像是一个相当常见的问题,从初级到中级开发人员往往在某个时候面临:他们要么不知道,要么不信任他们正在参与的合同,并在防守上过度检查无效。此外,在编写自己的代码时,他们倾向于依靠返回空代码来指示某些需要呼叫者检查无效的东西。

换句话说,有两种情况会出现无效检查:

如果合同中无效是有效的答复:和

如果它不是一个有效的响应。

(2)很简单。要么使用语句(断言)或允许失败(例如,空点除损)。断言是一个高度未使用的 Java 功能,已添加到 1.4 中。语法是:assert

assert <condition>
或

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

哪里是布尔表达,是一个对象,其方法的输出将包含在错误中。toString()

如果情况不正确,则声明会抛出 ()。默认情况下,Java 忽略断言。您可以通过将选项传递给合资企业来启用断言。您可以启用和禁用各个类和包的断言。这意味着您可以在开发和测试时用断言验证代码,并在生产环境中禁用它们,尽管我的测试几乎没有显示断言对性能的影响。assertErrorAssertionError-ea

在这种情况下不使用断言是可以的,因为代码将失败,这就是如果你使用断言会发生什么。唯一的区别是,与断言,它可能会发生得更快,在一个更有意义的方式,并可能与额外的信息,这可能有助于你找出为什么它发生,如果你不期待它。

(1) 有点困难。如果您无法控制您调用的代码,则会卡住。如果无效是有效的响应,则必须检查。

但是,如果是您控制的代码(通常情况就是这样),则情况就不同了。避免使用空作为响应。用返回集合的方法,很容易:返回空集合(或阵列),而不是几乎所有的时间空集合。

对于非收藏,它可能更难。以这为例:如果您有以下接口:

public interface Action {
  void doSomething();
}

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

Parser需要原始用户输入并找到一些要做的事情,也许如果您正在执行某些事情的命令行接口。现在,如果没有适当的操作,您可能会使合同返回无效。这导致您正在谈论的空检查。

另一种解决方案是永不返回空,而是使用空对象模式:

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 () 方法在发布具有有意义的错误消息的异常时是完全合适的,尤其是在您依赖用户输入的情况下。对于查找操作方法抛出异常比呼叫方法用一个简单的空点除外,无需解释而爆炸要好得多。

try {
    ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());
}
或者,如果您认为尝试/捕获机制太丑,而不是什么都不做,您的默认操作应向用户提供反馈。

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);
        }
    }
}
复制代码

文章翻译自 stackoverflow.com/questions/2…

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞???? 求关注❤️ 求分享???? 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️

标签:Java,断言,Avoiding,代码,Action,findAction,Debug,public
来源: https://blog.51cto.com/u_10182395/2787136