如何优雅的解决空指针?

简介: 在实际的系统运行过程中,难免会出现报NullPointerException空指针的错误,造成这样的本质原因就是数据或者对象为空,导致程序进一步执行的时候报错!

一、介绍

在实际的系统运行过程中,难免会出现报NullPointerException空指针的错误,造成这样的本质原因就是数据或者对象为空,导致程序进一步执行的时候报错!

一般的常规解决办法也就是加一个if判断。

if(obj != null){
  //doSomthing
}

如果出现需要判断的对象过多,难以避免的会出现很多对Null的判断语句,而这些语句一旦多起来,我们的代码就会变的惨不忍睹。

针对这种情况,我们可以引入了空对象模式以此来使我们的代码变的更优雅一点。

废话也不多说了,代码直接撸起来!

二、程序示例

下面,我们以获取从一个书籍库中获取书籍为例,实现过程如下!

先创建一个书籍抽象类AbstractBook,代码如下:

public abstract class AbstractBook {
    //书名
    protected String bookName;
    //判断是否存在
    public abstract boolean isExist();
    //获取书名
    public abstract String getName();
}

然后,创建一个具体实现类Book,如下:

public class Book extends AbstractBook {
    public Book(String bookName) {
        this.bookName = bookName;
    }
    @Override
    public boolean isExist() {
        return false;
    }
    @Override
    public String getName() {
        return bookName;
    }
}

接着,创建一个空对象NullObjectBook,如下:

public class NullObjectBook extends AbstractBook {
    @Override
    public boolean isExist() {
        return true;
    }
    @Override
    public String getName() {
        return "没有...";
    }
}

同时,创建一个书籍获取工厂BookFactory,如下:

public class BookFactory {
    public static final String[] names = {"java核心卷1", "java核心卷2", "软件随想录", "python入门"};
    public static AbstractBook getBook(String bookName){
        for (int i = 0; i < names.length; i++) {
            if(names[i].equals(bookName)){
                return new Book(bookName);
            }
        }
        return new NullObjectBook();
    }
}

最后,编写一个测试客户端,如下:

public class NullObjectClient {
    public static void main(String[] args) {
        AbstractBook book1 = BookFactory.getBook("java核心卷2");
        AbstractBook book2 = BookFactory.getBook("python入门");
        AbstractBook book3 = BookFactory.getBook("java编程思想");
        AbstractBook book4 = BookFactory.getBook("软件随想录");
        System.out.println(book1.getName());
        System.out.println(book2.getName());
        System.out.println(book3.getName());
        System.out.println(book4.getName());
    }
}

输出结果:

java核心卷2
python入门
没有...
软件随想录

从代码上可以看出,实现过程比较简单!

三、应用

空对象模式在编程中应用也很广,例如 google 的 guava 库提供了Optional类,可以有效的判断null对象。

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

在 jdk1.8 中也新增了Optional类,以提高程序的健壮性!

四、总结

在写代码的时候我们经常会遇到空指针,为了避免空指针的发生需要做一些判断。如果是复杂对象的话,还需要一层层地去判断。

巧妙的采用使用空对象模式,可以用于返回无意义的对象,从而承担处理null的责任,提升程序员的可读性!

相关文章
|
数据可视化
在使用SVN的过程中,通过哪些执行查看某个文件的修改信息
在使用SVN的过程中,通过哪些执行查看某个文件的修改信息
1761 0
|
4月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
移动开发 NoSQL Redis
阿里云Redis lua命令支持及相关限制说明
介绍阿里云Redis对lua命令的支持
11786 1
|
缓存 开发工具 数据库
Docker 及 Docker Compose 安装指南
Docker 是一个开源的容器化平台,可以帮助我们快速构建、打包和运行应用程序。而 Docker Compose 则是用于管理多个容器应用的工具,可以轻松定义和管理多个容器之间的关系。现在,让我们开始安装过程吧! apt安装
2758 0
|
网络协议 API PHP
PhalApi:在宝塔一键安装部署PHP开源接口框架的教程
要在宝塔面板上一键安装部署PhalApi开源接口框架,首先进入宝塔软件商店,切换到“一键部署”选项,搜索“phalapi”并点击“一键部署”。安装时需填写接口域名、数据库名及密码,提交后等待安装完成。安装成功后可在宝塔面板中查看新站点和源代码目录,并通过DNS解析设置访问接口域名,如`http://myapi.phalapi.net/`。默认开启的调试模式便于测试,可通过修改`config/sys.php`中的`debug`值为`false`关闭。最后,在源代码中开发自己的PHP接口,PhalApi会自动生成在线接口文档,方便后续调用与维护。更多详细教程可参考官方文档。
|
12月前
|
存储 关系型数据库 MySQL
使用Docker快速部署Mysql服务器
本文介绍了如何使用Docker快速部署MySQL服务器,包括下载官方MySQL镜像、启动容器、设置密码、连接MySQL服务器以及注意事项。
1064 18
|
算法 安全 Java
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
深入解析ECC(椭圆曲线密码学)加解密算法
|
程序员 开发者 Python
Python新手常见问题五:如何避免模块导入错误?
在Python编程中,模块的导入是每个开发者必须掌握的基础技能之一。模块化设计让代码更加有序、可复用和易于维护。然而,在实际操作过程中,新手程序员常常会遇到一些关于模块导入的问题,导致程序无法正常运行。本文将探讨几种常见的模块导入场景及容易犯错的操作,并提供相应的解决方案。
1518 4
|
存储 算法 安全
【集合系列】- 初探java集合框架图(一)
实际开发中,经常用到java的集合框架,比如ArrayList、LinkedList、HashMap、LinkedHashMap,几乎经常接触到,虽然用的多,但是对集合的整体框架,基础知识还是不够系统,今天想和大家一起来梳理一下!
1940 0
【集合系列】- 初探java集合框架图(一)