zoukankan      html  css  js  c++  java
  • 如何优雅规避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不能作为成员变量,方法参数 通常是作为方法的返回值
  • 相关阅读:
    HTML
    数据挖掘之分类——基于规则的分类器
    Ubuntu 14.04下Hadoop2.4.1集群安装配置教程
    Jdk1.7+eclipse搭建Java开发环境
    约瑟夫环问题
    Linux 绝对路径与相对路径
    排序算法汇总
    朋友圈问题
    HTTP状态码
    哈希冲突,哈希函数
  • 原文地址:https://www.cnblogs.com/ZhuChangwu/p/11150569.html
Copyright © 2011-2022 走看看