同为Crud工程的小伙伴盟,是不是经常在项目中的很多场景会遇到判空这个情况,但是有的时候我们使用 “ 某对象 != null ”代码可以运行成功,但是有的时候又需要用“ null != 某对象 ”,又或是当判断list集合时只能使用 “ list 集合.size() > 0 ” 不敢使用 前两者那样判断呢?说白了,大家就是怕程序运行过程中报“NullPointerException”😂
同样是对象,为什么判空每次都不太一样呢?今天小名来给大家说说小名在平时工作中遇到集合中判空的情景吧~希望能帮大家避坑。小名的能力有限,若是各位大佬在本文看到了存在错误的地方,还请各位能帮小名在评论区中批评指正!万分感谢🤝!
【第一种】
List<PracticeUser> users = null;
if (users == null) {
System.out.println("user-true");
} else {
System.out.println("user-false");
}
输出:
user-true
这是因为我们为其赋的初始值为null,这代表的是名为user这个集合中所有对象均为null;此时我们并没有初始化user这个集合。
当我们想调用集合中某个对象的 “getId()” 方法时:
List<PracticeUser> users = null;
if (users == null) {
System.out.println("user-true");
Long id = users.get(0).getId();
} else {
System.out.println("user-false");
}
运行结果如下:
就会报 NullPointerException 异常,我们可以看到“user-true”已经打印出来了,这说明异常存在于输出语句的下一行,即Long id = user.get(0).getId()。但是当我们在调用user中的"getId()"方法时,就会报空指针异常,这是因为其中第0个user对象并不存在(users集合中的所有对象都是null)。
这就是小名开头说到的,有的方法一会能运行一会不能运行的😭,到了测试同学手里就时不时的能运行。我们愿意称之为:玄学问题!
其实这主要是因为,我们在写代码、联调阶段,都会给自己的号加上一些假数据用于联调,但是到了测试同学的手里,往往是没有数据的,不明所云的同学,继续看就明白了
【第二种】
当我们使用mybatis-plus的时候:
List<PracticeUser> list = iPracticeUserService.lambdaQuery().eq(PracticeUser::getStatus, 2).list();
System.out.println("UserSize:" + list.size());
if (list == null) {
System.out.println("list-true");
} else {
System.out.println("list-false");
}
上述mybatis-plus链式写法看不懂的同学可以看我另一篇文章一篇朴实无华的MyBatis-Plus小白看完原地进阶的文章【CRUD1】简单单表查询
输出:
UserSize:0
list-false
当我们使用mybatis-plus查询出空对象的时候,mybatis会自动为我们创建这个空对象,即:
List<PracticeUser> list = new ArrayList<PracticeUser>
也就是说,当我们在通过mybatis查询出的对象集合为null时,mybatis会贴心的为我们把代码“改为”:
List<PracticeUser> list = new ArrayList<PracticeUser>
System.out.println("UserSize:" + list.size());
if (list == null) {
System.out.println("list-true");
} else {
System.out.println("list-false");
}
输出:
UserSize:0
list-false
【×】 而不会像【第一种】那样,如果mybatis查询出空对象的集合时,使其“变为”:
List<PracticeUser> user = null;
【其他】
前后端分离的场景,我们会使用 Dto 接收前端传给我们的数据,若我们想判断 dto 这个对象是不是null,不能单纯的使用 dto == null , 因为前端传过来的空对象是这样的:
PracticeUserDto dto = new PracticeUserDto();
if(dto == null){
System.out.println("true");
}else{
System.out.println("false");
}
输出:
false
虽然对象不为null,但是对象的所有属性均为null,当调用getId()方法的时候,就会报空指针异常。[boolean类型除外,以及序列化值除外]
【总结】
所以,当我们要对list集合判空的时候,我们可以使用
if (list != null && list.size() != 0) {
//取list中的值,或调用其中的方法
}else{
//list为空的操作
}
这样,前者避免了list在未初始化的情况下,报空指针错误;后者验证list中有没有数据
举个例子:你喝水的时候,前者是判断你有没有杯子,后者是在判断杯子里有没有水 |
如若您在文章中发现任何错误的地方,小名希望您可以在评论区给予批评指正🤝 如果觉得小名的文章帮助到了您,请关注小名的专栏【日常记错】,支持一下小名😄,给小名的文章点赞👍、评论✍、收藏🤞谢谢大家啦~♥♥♥