【网红解决List<Object obj>空指针异常的小妙招】NullPointerException怎么又来了,没完没了。

在这里插入图片描述

  同为Crud工程的小伙伴盟,是不是经常在项目中的很多场景会遇到判空这个情况,但是有的时候我们使用 “ 某对象 != null ”代码可以运行成功,但是有的时候又需要用“ null != 某对象 ”,又或是当判断list集合时只能使用 “ list 集合.size() > 0 ” 不敢使用 前两者那样判断呢?说白了,大家就是怕程序运行过程中报“NullPointerException”😂

  同样是对象,为什么判空每次都不太一样呢?今天小名来给大家说说小名在平时工作中遇到集合中判空的情景吧~希望能帮大家避坑。小名的能力有限,若是各位大佬在本文看到了存在错误的地方,还请各位能帮小名在评论区中批评指正!万分感谢🤝!


小名真的是饱受 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;

往往,我们会在Bug丛生的测试阶段,前后端连抛 “绣球”“甩锅”等“盛况”

在这里插入图片描述

下面小名来复原一下 “甩锅” 的场景:

【其他】

前后端分离的场景,我们会使用 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类型除外,以及序列化值除外]


在这里插入图片描述

Bug改完了,下班回家!

【总结】

所以,当我们要对list集合判空的时候,我们可以使用

if (list != null && list.size() != 0) {
    //取list中的值,或调用其中的方法
}else{
    //list为空的操作
}

这样,前者避免了list在未初始化的情况下,报空指针错误;后者验证list中有没有数据


给大家举个栗子!

在这里插入图片描述

希望大家通过下面这个栗子加强记忆

举个例子:你喝水的时候,前者是判断你有没有杯子,后者是在判断杯子里有没有水

如若您在文章中发现任何错误的地方,小名希望您可以在评论区给予批评指正🤝 如果觉得小名的文章帮助到了您,请关注小名的专栏【日常记错】,支持一下小名😄,给小名的文章点赞👍、评论✍、收藏🤞谢谢大家啦~♥♥♥
  • 34
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
这个错误提示说明你尝试将一个 `List<List<Object & Serializable & Comparable<?>>>` 类型的对象转换为 `List<List<Object>>` 类型的对象,但是这两个类型不兼容。 `List<List<Object & Serializable & Comparable<?>>>` 类型表示一个元素类型为 `List`,其中每个元素又是一个元素类型为 `Object`、`Serializable` 和 `Comparable` 的对象的列表。而 `List<List<Object>>` 类型表示一个元素类型为 `List`,其中每个元素又是一个元素类型为 `Object` 的对象的列表。 由于 `Object & Serializable & Comparable<?>` 比 `Object` 类型更加具体,所以 `List<List<Object & Serializable & Comparable<?>>>` 类型的对象不能直接转换为 `List<List<Object>>` 类型的对象,因为前者包含了更多的信息。 如果你需要将 `List<List<Object & Serializable & Comparable<?>>>` 类型的对象转换为 `List<List<Object>>` 类型的对象,你可以考虑先将其中每个元素中的 `Object & Serializable & Comparable<?>` 类型的对象转换为 `Object` 类型的对象,再将整个列表转换为 `List<List<Object>>` 类型的对象。例如: ```java List<List<Object & Serializable & Comparable<?>>> list1 = ...; List<List<Object>> list2 = new ArrayList<>(); for (List<Object & Serializable & Comparable<?>> innerList : list1) { List<Object> convertedInnerList = new ArrayList<>(); for (Object & Serializable & Comparable<?> obj : innerList) { convertedInnerList.add((Object) obj); // 将 Object & Serializable & Comparable<?> 类型的对象转换为 Object 类型的对象 } list2.add(convertedInnerList); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进阶的小名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值