记录:springboot使用resultType空指针java.lang.NullPointerException: null...【亲测有效】

854 阅读6分钟

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN博客专家,C站历届博客之星Top50,掘金/InfoQ/51CTO等社区优质创作者,全网合计8w粉+,对一切技术感兴趣,重心偏Java方向;硬核公众号「 猿圈奇妙屋」,欢迎小伙伴们的加入,一起秃头,一起变强。
..
✍️温馨提醒:本文字数:1999字, 阅读完需:约 5 分钟

       嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

环境说明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE

       哈喽,小伙伴们,我是bug菌呀👀,不知不觉就一年又4月,正是踏青郊游的好时节。可上海疫情,除了在家远程办公就是看点技术顺便卷点文章。这不是4月又出了更文活动,逼自己一把,坚持每天做点内容输出,养成写作习惯,将来你会回来感谢曾经的自己坚持了一把才有此刻的辉煌成就。

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,掘金不停💕,加油☘️​

二、版本说明🔥

环境:springboot2.3.1.REALSE + jdk1.8 + mysql5.6

三、报错详情🔥

       又是找bug的一天,非常之离谱!又是给同事排错,虽然对于我而言,其实排错无非就是debug,但是业务逻辑不清楚的地方,对自己而言还得盯人家写的理一遍,多耽误事儿呀!但是总不能放任报错不管吧,能咋办,改bug呗!

       此处控制台是直接空指针,一般就是返回集合或对象为空,但你没有进行验空就直接使用它来获取里头的元素或属性就会报空指针。

       所以具体问题咋哪儿呢?其实就只需要看控制台打印的报错位于哪里,去那里degue看一眼,其实八九不离十就按我说的思路排一遍就清楚了。

如下是具体控制台报错截图:

​四、报错分析🔥

       我们看报错显示在ChartsServiceImpl.java文件的第437行,我们直接打开这个文件,去看这块代码,437行是一个map.put()的过程,如果这行代码导致报错,那必然是pg.getProfessionalGroupName()这里获取属性报错!我们再看pg是遍历professionalGroups集合的一个对象,那就说明,这个对象里头的professionalGroupName为null,才会导致获取报空。

       可以看一下,确实是因为pg对象为null,获取其professionalGroupName属性而报错。

       为了验证我的猜测,我打算直接本地debug断点在获取professionalGroups集合这一行,看看professionalGroups集合里头装的到底是什么?

       好家伙,大家请看,果不其然,professionalGroups``(ArrayList),其size = 2,但具体显示All elements are null

       一般情况都是直接展示具体对象值,但是这里却展示All elements are null,那我们来分析一下为何会产生All elements are null问题,首先我们都知道List是允许插入空值,然后,mybtis映射到List有空值。那么Mybatis映射到List有空值,就有可能是以下情况了

  • sql语句映射有问题,
  • 可能sql本身产生了一条为null的记录。

我们继续排查,检查一下这个方法所执行的源sql。大家请看,首先sql语法是没问题的。

       返回类型是个对象,且使用的是resultType,我们都知道使用resultType指定返回对象pojo,其必定要求sql返回字段名的驼峰命名要与你指定的pojo属性要一致,否则是无法映射上该字段的。

       所以我们直接打开该FindByProfessionalGroupTopFiveVo对象看一眼,一切就会真相大白了!好家伙,果然是驼峰命名不一致,sql没有指定别名,所以转驼峰是professionalGroup,而vo中所定义的属性名又为professionalGroupName

​所以,推理到这里,小伙伴们都知道应该怎么改了么?

五、解决方案🔥

为解决映射关系,以下我提供的三种解决方案,仅供参考。

1️⃣方案一:

只修改vo,将FindByProfessionalGroupTopFiveVo对象中的professionalGroupName属性名改成professionalGroup

具体演示请看如下:

2️⃣方案二:

只修改源sql,将professional_group 进行别名,指定名称为professionalGroupName即可。

具体演示请看如下:

3️⃣方案三:

使用resultMap进行指定返回类型,然后定义一个resultMap,其中指定一下映射名。

具体演示请看如下:

​... ...

       ok,以上这样就好啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

六、往期推荐🔥

文末🔥

       如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

       感谢认真读完我博客的铁子萌,在这里呢送给大家一句话,不管你是在职还是在读,绝对终身受用。
时刻警醒自己:
抱怨没有用,一切靠自己;
想要过更好的生活,那就要逼着自己变的更强,生活加油!!!