前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次Java空指针的问题

记一次Java空指针的问题

作者头像
javascript艺术
发布2021-09-18 10:39:29
5840
发布2021-09-18 10:39:29
举报
文章被收录于专栏:javascript艺术javascript艺术

背景介绍

上线后,接口偶尔会出现调用失败。通过查询日志发现是由于空指针导致的,猜测是由于数据问题导致的。

场景描述

从其他的业务系统中查询分类列表,并根据数量统计字段,来判断是否包含数据

代码语言:javascript
复制
public class CategoryDTO {
    
    /**分类名称*/
    private String name;
    
    /**分类编码*/
    private String code;
    
    /**数量统计*/
    private Integer count;
    
    /**根据count > 0 ? true : false;*/
    private boolean hasValue;
    
}

接口查询结果就是List<CategoryDTO>,其实只需要遍历分类并对 count字段做判断即可。

问题确认

代码语言:javascript
复制
/*
* 数量判断的代码大致逻辑如下,空指针异常发生在flag转换这里
*/
list.forEach(item -> {
    Boolean flag = item.getCount() > 0 ? Boolean.TRUE : Boolean.FALSE;
    item.setHasValue(flag);
});

猜测可能是上游业务系统返回的列表中包含了NULL,所以在遍历前增加了空的判断

代码语言:javascript
复制
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类型,当Integerint做比较时,会先将Integer转换到int,其实是执行了Integer.intValue(),从item拿到非空的数据,但是count字段是空,导致在比较前的类型转换,产生了NullPointerException

总结

在使用Java包装类向基础数据类型做计算时,需要判断是否为空,避免因为拆箱导致的NPE。

做个记录,以免后续再遇到这样的问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 javascript艺术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
  • 场景描述
  • 问题确认
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档