前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何优雅的解决空指针?

如何优雅的解决空指针?

作者头像
Java极客技术
发布2022-12-02 21:35:38
9960
发布2022-12-02 21:35:38
举报
文章被收录于专栏:Java极客技术Java极客技术

一、介绍

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

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

代码语言:javascript
复制
if(obj != null){
  //doSomthing
}

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

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

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

二、程序示例

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

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

代码语言:javascript
复制
public abstract class AbstractBook {

    //书名
    protected String bookName;

    //判断是否存在
    public abstract boolean isExist();

    //获取书名
    public abstract String getName();
}

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

代码语言:javascript
复制
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,如下:

代码语言:javascript
复制
public class NullObjectBook extends AbstractBook {

    @Override
    public boolean isExist() {
        return true;
    }

    @Override
    public String getName() {
        return "没有...";
    }
}

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

代码语言:javascript
复制
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();
    }
}

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

代码语言:javascript
复制
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());
    }
}

输出结果:

代码语言:javascript
复制
java核心卷2
python入门
没有...
软件随想录

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

三、应用

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

代码语言:javascript
复制
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

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

四、总结

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

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

五、参考

1、菜鸟教程 - 空对象模式

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java极客技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、程序示例
  • 三、应用
  • 四、总结
  • 五、参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档