同事告诉我应该这样判空

1,166 阅读3分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

写在前面

我们都知道java8 Optional的诞生,解决了 if NULL 的问题,大家用的也游刃有余。但是这样就真的无后顾之忧了吗,是否还会出现 java.lang.NullPointerException,我们今天来看看

我们先看个测试类

public class ListTest {
    static List<User> list =null;
    public static void main(String[]args) {
        //01
        System.out.println(list.isEmpty());// 
        //02
        System.out.println(CollectionUtils.isEmpty(list));
    }
}

抛出问题:上面01和02 哪个会出现java.lang.NullPointerException,结尾给答案

空指针梦魇

java.lang.NullPointerException

这个画面的出现是每个程序员碰到的,比较low且不可避免的,之所以是比较low,是因为不该出现这么低级的错误,不可避免是因为下面两种原因

一种是由于业务逻辑没有判空,另外一种是没有一些坑没有考虑到(今天我们主要讨论这种)

我们先来看一段代码,通过id查询用户实体

java8之前是这样的

public User getById(Integer userId) {
    List<User> list = mapper.selectById(userId);
    if(list != null){
        return list.get(0);
    }
    return;
}

java8操作

public User getById(Integer userId) {
    List<User> list = mapper.selectById(userId);
    return Optional.ofNullable(list).map(user -> user.get(0)).orElse(null);
}

写到这里 我想问,这里会不会报错,答案:会的,当list 查出来不是null,而是0 首先我们要知道这是list,有伙伴就说了,为什么非要弄个list,不能是查出个对象吗,其实这里是根据业务来的,有些业务就是必须查出个list。

回归正题,当list为0的时候 ofNullable 可能会校验不出来,但是对象不会报错,为什么 因为对象只有null 和 非null 两种情况, 但是list不是。

同事看到后,一顿操作,我们看下解决方案:

CollectionUtils

是的,没错 利用Spring中的集合工具类。 看下代码

public User getById(Integer userId) {
    List<User> list = mapper.selectById(userId);
    return Optional.ofNullable(list)
                   .filter(u -> !CollectionUtils.isEmpty(list))
                   .map(user -> user.get(0)).orElse(null);
}

利用filter 再筛选一层,利用CollectionUtils.isEmpty函数,不管是null还是0,都不会到map那里get的时候出现NullPointerException。这样便可保证万无一失。

那这个你在平常代码中也可以运用

List<User> list = mapper.selectById(userId);
if(!CollectionUtils.isEmpty(list)){
    //执行逻辑
}

我们看下他的源码

public abstract class CollectionUtils {

   /**
    * Return {@code true} if the supplied Collection is {@code null} or empty.
    * Otherwise, return {@code false}.
    * @param collection the Collection to check
    * @return whether the given Collection is empty
    */
   public static boolean isEmpty(@Nullable Collection<?> collection) {
      return (collection == null || collection.isEmpty());
   }
}

可以看到 他无非也是自己判断了,所以只是个工具类。帮你做了一些事情。

总结

那文章开头01和02的答案自然就出来了。

01会报空,02则安全。

好了 今天的分享就到这里,我们要善于发现这些工具类 来帮我们解决一些问题。

值得深究的是,java为什么不把更好的工具方式合进去呢?或者你们知道的一些工具类和其他好的方案,欢迎评论区聊聊

弦外之音

感谢你的阅读,如果你感觉学到了东西,您可以点赞,关注。也欢迎有问题我们下面评论交流

加油! 我们下期再见!

给大家分享几个我前面写的几篇骚操作

copy对象,这个操作有点骚!

干货!SpringBoot利用监听事件,实现异步操作