上线后,接口偶尔会出现调用失败。通过查询日志发现是由于空指针导致的,猜测是由于数据问题导致的。
从其他的业务系统中查询分类列表,并根据数量统计字段,来判断是否包含数据
public class CategoryDTO {
/**分类名称*/
private String name;
/**分类编码*/
private String code;
/**数量统计*/
private Integer count;
/**根据count > 0 ? true : false;*/
private boolean hasValue;
}
接口查询结果就是List<CategoryDTO>
,其实只需要遍历分类并对 count
字段做判断即可。
/*
* 数量判断的代码大致逻辑如下,空指针异常发生在flag转换这里
*/
list.forEach(item -> {
Boolean flag = item.getCount() > 0 ? Boolean.TRUE : Boolean.FALSE;
item.setHasValue(flag);
});
猜测可能是上游业务系统返回的列表中包含了NULL,所以在遍历前增加了空的判断
list.stream()
.filter(Objects::nonNull)
.forEach(item -> {
Boolean flag = item.getCount() > 0 ? Boolean.TRUE : Boolean.FALSE;
item.setHasValue(flag);
});
运行修改的代码后,发现还是会在count
转换flag
会抛出空指针,并且确认item
是非空的。那么问题到底出现在了哪里呢?经过思考后,猜测问题在item.getCount() > 0
,忽略了item.getCount()
返回的是Integer
类型,当Integer
和int
做比较时,会先将Integer
转换到int
,其实是执行了Integer.intValue()
,从item
拿到非空的数据,但是count
字段是空,导致在比较前的类型转换,产生了NullPointerException
在使用Java包装类向基础数据类型做计算时,需要判断是否为空,避免因为拆箱导致的NPE。
做个记录,以免后续再遇到这样的问题。
本文分享自 javascript艺术 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!