项目中尤其是在持久层,难免会有大量的针对集合,对象,字符串的操作,为了程序的健壮性,我们不得不进行判空,像下面箭头式编码吗?
1 | if(null!=person){ |
NO
优雅的规避空指针异常
一. 工具类
坐标
1 | <dependency> |
针对字符串
1 | String name=""; |
坐标
1 | <dependency> |
针对集合
1 | boolean empty = CollectionUtils.isEmpty(new ArrayList()); |
上面两个工具类也是真正项目中重用的,会比我们自己写一堆if去判断相对安全
我们知道,后端通常会从DB查询多条数据,封装一个集合交给前端渲染,一旦这个集合为空,就会报错 NPE,前面的工具类可以帮我们很好的做出判断,具体怎么做,大概有两种方式
- 第一种,我们自定义异常,一旦出现null,我们抛出自定义的异常给前端,前端接收到异常,进行处理
- 第二种,一旦出现null;我们手动new 一个相应的集合或者对象,前端接受到空的集合,渲染的也是空,同样避免的空指针异常
二. Optional
位于java.util包下Optional是jdk8新增的final工具类,我们可以通过它以一种函数式风格灵活的进行判断,处理
Optional是一个容器对象,传递给它什么,他就包装什么!
它有如下几种工厂方法创建OPtional对象
- 使用 of 方法, 必须确保传递进去的对象不为空,不然直接抛出空指针异常
1 | public static <T> Optional<T> of(T value) { |
- 创建一个一定为空的容器对象
1 | public static<T> Optional<T> empty() { |
- 创建一个可能为空,也可能不为空的容器对象
1 | public static <T> Optional<T> ofNullable(T value) { |
下面几个方法引入函数式编程风格
- 如果容器为空,打印备选值
1 | System.out.println(optional.orElse("hello")); |
- 如果容器为空,打印备选值 入参是Supplier, 不接受参数返回一个结果
1 | System.out.println(optional.orElseGet(()->"haha")); |
如何使用函数式编程风格替换掉
1 | if(null!=list){ |
1 | //模拟后端的查询出来的结果 |
- 此外: Optional不能作为成员变量,方法参数 通常是作为方法的返回值