如何优雅的解决空指针?

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

[[434950]]

一、介绍

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

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

if(obj != null){ 
  //doSomthing 

  • 1.
  • 2.
  • 3.

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

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

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

二、程序示例

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

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

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

然后,创建一个具体实现类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; 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

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

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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

同时,创建一个书籍获取工厂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(); 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

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

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()); 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

输出结果:

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

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

三、应用

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

ptional<Integer> possible = Optional.of(5); 
possible.isPresent(); // returns true 
possible.get(); // returns 5 
  • 1.
  • 2.
  • 3.

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

四、总结

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

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

五、参考

 

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

 

责任编辑:武晓燕 来源: Java极客技术
相关推荐

2024-10-15 15:58:11

2023-10-08 11:09:22

Optional空指针

2023-08-04 08:52:52

Optional消灭空指针

2024-02-01 12:09:17

Optional容器null

2024-02-28 09:03:20

Optional空指针Java

2015-07-30 10:12:32

JavaNullAssert

2020-09-25 11:30:20

Java判空代码

2020-11-02 07:43:33

前端空指针数据

2020-04-10 10:22:12

Java判空编程语言

2022-01-19 09:00:00

Java空指针开发

2025-02-27 09:39:56

JavaJava 8对象

2024-12-06 10:12:20

2024-02-22 14:06:39

C++指针开发

2024-08-12 08:28:35

2022-01-04 23:13:57

语言PanicGolang

2015-11-26 10:53:45

LinuxWindowsMac OS

2021-01-19 10:35:49

JVM场景函数

2017-07-26 11:32:50

NETRabbitMQ系统集成

2022-08-11 11:09:38

线上问题程序员

2023-10-10 13:23:18

空指针异常Java
点赞
收藏

51CTO技术栈公众号