如何优雅的解决空指针?

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

[[434950]]

一、介绍

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

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

  1. if(obj != null){ 
  2.   //doSomthing 

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

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

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

二、程序示例

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

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

  1. public abstract class AbstractBook { 
  2.  
  3.     //书名 
  4.     protected String bookName; 
  5.  
  6.     //判断是否存在 
  7.     public abstract boolean isExist(); 
  8.  
  9.     //获取书名 
  10.     public abstract String getName(); 

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

  1. public class Book extends AbstractBook { 
  2.  
  3.     public Book(String bookName) { 
  4.         this.bookName = bookName; 
  5.     } 
  6.  
  7.     @Override 
  8.     public boolean isExist() { 
  9.         return false
  10.     } 
  11.  
  12.     @Override 
  13.     public String getName() { 
  14.         return bookName; 
  15.     } 

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

  1. public class NullObjectBook extends AbstractBook { 
  2.  
  3.     @Override 
  4.     public boolean isExist() { 
  5.         return true
  6.     } 
  7.  
  8.     @Override 
  9.     public String getName() { 
  10.         return "没有..."
  11.     } 

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

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

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

  1. public class NullObjectClient { 
  2.  
  3.     public static void main(String[] args) { 
  4.         AbstractBook book1 = BookFactory.getBook("java核心卷2"); 
  5.         AbstractBook book2 = BookFactory.getBook("python入门"); 
  6.         AbstractBook book3 = BookFactory.getBook("java编程思想"); 
  7.         AbstractBook book4 = BookFactory.getBook("软件随想录"); 
  8.  
  9.         System.out.println(book1.getName()); 
  10.         System.out.println(book2.getName()); 
  11.         System.out.println(book3.getName()); 
  12.         System.out.println(book4.getName()); 
  13.     } 

输出结果:

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

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

三、应用

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

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

在 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-28 09:03:20

Optional空指针Java

2024-02-01 12:09:17

Optional容器null

2015-07-30 10:12:32

JavaNullAssert

2020-09-25 11:30:20

Java判空代码

2020-04-10 10:22:12

Java判空编程语言

2020-11-02 07:43:33

前端空指针数据

2022-01-19 09:00:00

Java空指针开发

2024-08-12 08:28:35

2024-02-22 14:06:39

C++指针开发

2022-08-11 11:09:38

线上问题程序员

2022-01-04 23:13:57

语言PanicGolang

2021-01-19 10:35:49

JVM场景函数

2017-07-26 11:32:50

NETRabbitMQ系统集成

2015-11-26 10:53:45

LinuxWindowsMac OS

2020-10-16 11:48:06

服务器系统运维

2023-10-10 13:23:18

空指针异常Java

2020-08-26 07:17:19

通信
点赞
收藏

51CTO技术栈公众号