这是我参与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为什么不把更好的工具方式合进去呢?或者你们知道的一些工具类和其他好的方案,欢迎评论区聊聊
弦外之音
感谢你的阅读,如果你感觉学到了东西,您可以点赞,关注。也欢迎有问题我们下面评论交流
加油! 我们下期再见!
给大家分享几个我前面写的几篇骚操作