在Java中避免NullPointerException的解决方案

 更新时间:2021年04月15日 09:13:52   作者:python之恋  
这篇文章主要介绍了在Java中避免NullPointerException的解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

object != null要避免很多NullPointerException

有什么替代方法:

if (someobject != null) {
    someobject.doCalc();
}

解决方案:

在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null。另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值。

换句话说,在两种情况下会出现空检查:

  1. 如果为null,则表示合同中的有效回复;和
  2. 如果不是有效的回应。

(2)容易。使用assert语句(断言)或允许失败(例如NullPointerException)。断言是1.4中新增的一个未被广泛使用的Java功能。语法为:

assert <condition>

或者

assert <condition> : <object>

where<condition>是一个布尔表达式,<object>是一个对象,其toString()方法的输出将包含在错误中。

一个assert语句抛出一个ErrorAssertionError如果条件是不正确的)。默认情况下,Java会忽略断言。您可以通过将选项传递-ea给JVM来启用断言。您可以启用和禁用单个类和程序包的断言。这意味着尽管我的测试几乎没有显示断言对性能的影响,但是您可以在开发和测试时使用断言来验证代码,并在生产环境中禁用它们。

在这种情况下,不使用断言是可以的,因为代码只会失败,这就是使用断言时会发生的情况。唯一的区别是,有了断言,它可能会更早地发生,以更有意义的方式出现,并可能带有额外的信息,这可以帮助您弄清楚为什么它出乎意料。

(1)有点难。如果您无法控制正在调用的代码,那么您将陷入困境。如果null为有效响应,则必须检查它。

但是,如果是您控制的代码(通常是这种情况),那就是另一回事了。避免使用null作为响应。使用返回集合的方法很容易:几乎总是一直返回空集合(或数组)而不是null。

使用非集合,可能会更困难。以这个为例:如果您具有以下接口:

public interface Action {
  void doSomething();
}

public interface Parser {
  Action findAction(String userInput);
}

在Parser中,原始的用户输入会找到要执行的操作,也许是在您实现某项功能的命令行界面时。现在,如果没有适当的操作,您可以使合同返回null。这将导致您正在谈论的空检查。

另一种解决方案是从不返回null,而使用Null Object模式:

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()方法来说,抛出带有有意义的错误消息的Exception异常是完全适当的-特别是在这种情况下,您依赖于用户输入。对于findAction方法抛出一个异常,比对一个没有解释的简单NullPointerException进行抛出的调用方法要好得多。

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

或者,如果您认为try / catch机制太丑陋,而不是什么都不做,则您的默认操作应向用户提供反馈。

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中避免NullPointerException的解决方案的文章就介绍到这了,更多相关Java中避免NullPointerException内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA使用ffmepg处理视频的方法(压缩,分片,合并)

    JAVA使用ffmepg处理视频的方法(压缩,分片,合并)

    这篇文章主要介绍了JAVA使用ffmepg处理视频的方法,包括视频压缩分片合并功能,通过实例代码讲解的很详细,对java ffmepg处理视频相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • SpringBoot整合Swagger和Actuator的使用教程详解

    SpringBoot整合Swagger和Actuator的使用教程详解

    Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、记录以及使用 Rest API。本篇文章主要介绍的是SpringBoot整合Swagger(API文档生成框架)和SpringBoot整合Actuator(项目监控)使用教程。感兴趣的朋友一起看看吧
    2019-06-06
  • Java网络编程UDP实现消息发送及聊天

    Java网络编程UDP实现消息发送及聊天

    这篇文章主要为大家详细介绍了Java网络编程UDP实现消息发送及聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java的泛型擦除和运行时泛型信息获取方式

    Java的泛型擦除和运行时泛型信息获取方式

    Java泛型在编译时会发生类型擦除,即泛型参数被替换为它们的限定类型(如Object),这使得ArrayList<Integer>和ArrayList<String>在运行时类型相同,尽管如此,我们可以通过定义类或匿名内部类的方式在运行时获取泛型信息
    2024-09-09
  • java局部变量表的基础知识点及实例

    java局部变量表的基础知识点及实例

    在本篇文章里小编给大家整理的是一篇关于java局部变量表的基础知识点及实例,有需要的朋友们可以学习参考下。
    2021-06-06
  • 启动springboot应用因未配置数据库报错的解决方案

    启动springboot应用因未配置数据库报错的解决方案

    这篇文章主要介绍了启动springboot应用因未配置数据库报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 关于Java的对象序列化流和反序列化流详细解读

    关于Java的对象序列化流和反序列化流详细解读

    这篇文章主要介绍了关于Java的对象序列化流和反序列化流,对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象,反之,自己序列还可以从文件中读取回来,重构对象,对它进行反序列化,需要的朋友可以参考下
    2023-05-05
  • SpringBoot操作Mongodb的实现示例

    SpringBoot操作Mongodb的实现示例

    本文主要介绍了SpringBoot操作Mongodb的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Ubuntu 15下安装Eclipse经验分享

    Ubuntu 15下安装Eclipse经验分享

    这篇文章主要为大家分享了Ubuntu 15下安装Eclipse经验,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • SpringMVC实战案例RESTFul实现添加功能

    SpringMVC实战案例RESTFul实现添加功能

    这篇文章主要为大家介绍了SpringMVC实战案例RESTFul实现添加功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论