List异常报错: list All elements are null
欢迎并感谢浏览卢小龙的本篇文章
你好!亲爱的读者,本篇文章将主要记录本人对List集合数据处理时元素为空的踩坑问题记录,方便自己的学习历程记录以及复习参考,若有言错之处,请各位给予指点.
问题描述
笔者当时正对List进行遍历处理,发现有一List集合并未被**Collectionutils.isEmpty()**判断出来,在确定不是Util的问题后,在Debug的过程中发现:
该集合确实size不等于0,但是提示信息为"所有元素都为空",显示为"All elements are null" 。初次发现简直堪称神奇啊。
问题排查
首先着手于SQL的排查,笔者将SQL单独在Navicat中执行;
SELECT CONTRACT_NO
FROM MP_SHARE_CONTRACT
WHERE SHARE_ID IN ('1390311','1390312','1390313')
执行结果如下:
返回的是一个字段 CONTRACT_NO 并且显示的是Null。
然后笔者执行了查询全部字段的SQL
SELECT *
FROM MP_SHARE_CONTRACT
WHERE SHARE_ID IN ('1390311','1390312','1390313')
执行结果如下:
会惊奇的发现有一条数据,并且这条数据的 CONTRACT_NO 的值是Null。
其实问题就出在这里,平时我们早已习惯了
list == null || list.size() == 0
却疏忽了ArrayList允许添加null值!
当根据查询条件查询出一条数据,但是返回的字段只有一个并且恰巧是Null。所以才会出现集合大小为1,但是集合里面的数据都为Null的结果,后续若是对此集合进行操作就会出现list All elements are null错我。Null并不是没有数据哦,是数值为Null的数据。如果没有数据数据库会是这样的:
问题解决
该问题解决思路为两种
1.SQL加上字段 is not null 的条件;
SELECT CONTRACT_NO
FROM MP_SHARE_CONTRACT
WHERE SHARE_ID IN ('1390311','1390312','1390313')
AND CONTRACT_NO is not null
2.对List进行null元素去除。
//移除第一个null
list.remove(null);
//移除所有的null元素
list.removeAll(Collections.singleton(null));
经测试两种方法都可以解决问题。