如何优雅规避NPE

简介: 如何优雅规避NPE

项目中尤其是在持久层,难免会有大量的针对集合,对象,字符串的操作,为了程序的健壮性,我们不得不进行判空,像下面箭头式编码吗?



if(null!=person){
    ...
    if(null!=address){
        ...
        if(null!=phone){
            ...
        }
    }
}


NO


优雅的规避空指针异常#


一. 工具类#


坐标


<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>


针对字符串


String name="";
boolean blank = StringUtils.isBlank(name);
System.out.println(blank);


坐标


<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.2</version>
</dependency>


针对集合


boolean empty = CollectionUtils.isEmpty(new ArrayList());
System.out.println(empty);


上面两个工具类也是真正项目中重用的,会比我们自己写一堆if去判断相对安全


我们知道,后端通常会从DB查询多条数据,封装一个集合交给前端渲染,一旦这个集合为空,就会报错 NPE,前面的工具类可以帮我们很好的做出判断,具体怎么做,大概有两种方式


  • 第一种,我们自定义异常,一旦出现null,我们抛出自定义的异常给前端,前端接收到异常,进行处理
  • 第二种,一旦出现null;我们手动new 一个相应的集合或者对象,前端接受到空的集合,渲染的也是空,同样避免的空指针异常


二. Optional#


位于java.util包下Optional是jdk8新增的final工具类,我们可以通过它以一种函数式风格灵活的进行判断,处理


Optional是一个容器对象,传递给它什么,他就包装什么!


它有如下几种工厂方法创建OPtional对象


  • 使用 of 方法, 必须确保传递进去的对象不为空,不然直接抛出空指针异常


public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}


  • 创建一个一定为空的容器对象


public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}


  • 创建一个可能为空,也可能不为空的容器对象


public static <T> Optional<T> ofNullable(T value) {
    return value == null ? empty() : of(value);
}


下面几个方法引入函数式编程风格


  • 如果容器为空,打印备选值


System.out.println(optional.orElse("hello"));


  • 如果容器为空,打印备选值 入参是Supplier, 不接受参数返回一个结果


System.out.println(optional.orElseGet(()->"haha"));


如何使用函数式编程风格替换掉


if(null!=list){
        return list;
    }else{
        return new ArrayList():
    }



//模拟后端的查询出来的结果
List<student> list = Arrays.asList(new student(1, "123"), new student(2, "123"));
OptionalText optionalText = new OptionalText();
optionalText.setStuList(list);
//创容器
Optional<OptionalText> optional1 = optional.ofNullable(optionalText);
//容器里面对象的list如果有值则返回,如果没有,则返回空list
List<student> students = optional1.map(item -> item.getStuList()).orElse(new ArrayList<student>());


  • 此外: Optional不能作为成员变量,方法参数 通常是作为方法的返回值
相关文章
|
设计模式 运维 Java
开发中造成空指针的常见写法,如何预防!
开发中造成空指针的常见写法,如何预防!
100 0
|
3月前
|
存储 安全 Java
如何避免`ArrayStoreException`异常?
`ArrayStoreException`是在Java中尝试将错误类型的对象存储到泛型数组时抛出的异常。要避免此异常,需确保向数组添加的对象类型与数组声明的类型一致,使用泛型和类型检查,以及在运行时进行类型安全的转换和验证。
56 6
|
3月前
|
监控 安全 算法
线程死循环确实是多线程编程中的一个常见问题,在编码阶段规避潜在风险
【10月更文挑战第12天】线程死循环确实是多线程编程中的一个常见问题,在编码阶段规避潜在风险
74 2
|
3月前
|
机器学习/深度学习 数据挖掘
在处理异常值时,有哪些常见的误区需要避免?
在处理异常值时,有哪些常见的误区需要避免?
|
5月前
|
安全 测试技术 数据库连接
如何避免 C# 中的异常
【8月更文挑战第27天】
65 2
|
6月前
|
C++
C++ 异常机制问题之捕获异常的问题如何解决
C++ 异常机制问题之捕获异常的问题如何解决
|
8月前
|
安全 Java UED
如何避免NumberFormatException异常?
【4月更文挑战第30天】如何避免NumberFormatException异常?
90 1
|
8月前
|
NoSQL 测试技术 C++
C++的异常处理及错误调试技巧
C++的异常处理及错误调试技巧
104 0
项目中常见NPE空指针异常
项目中常见NPE空指针异常
|
Java 测试技术 API
开发小技巧系列 - 如何避免NPE,去掉if...else(四)
利用optional来处理各种IF-ELSE的判断
123 0