线上钉钉群突然报空指针异常,结合日志分析代码,如下:
报错信息:(含入参)
reQueryDto={\"minAge\":null,\"maxAge\":26,\"startBirthYear\":null,\"endBirthYear\":1995}java.lang.NullPointerException: null\n\tat com.**.buildSearchQueryDto(RSearchListHandle.java:156)
源码:代码是想通过endBirth和startBirth是否为null赋一个布尔值或者null。
// 年龄Integer startBirth = reQueryDto.getMinAge() != null ? reQueryDto.getStartBirthYear() : null;Integer endBirth = reQueryDto.getMaxAge() != null ? reQueryDto.getEndBirthYear() : null;if (startBirth != null || endBirth != null) {query.setBirthYear(new IntRangeParam(endBirth, endBirth != null ? Boolean.TRUE : null, startBirth,startBirth != null ? Boolean.TRUE : null));}
带入参数分析:
minAge = null ; maxAge = 26; 推导出startBirth = null; endBirth = 1995; 满足if条件 endBirth != null
进入if内部逻辑。粗看创建IntRangeParam的逻辑没有问题,为什么就会报空指针呢?
分析:IntRangeParan的第二个参数和第四个参数是布尔值,如果条件不满足,为false时,就会赋一个空值,导致一个空指针异常。那么我们看看IntRangeParam类中的这两个参数类型:includeFrom 和 includeTo居然是基本类型,那肯定会报错了。
这里涉及到,基本类型没有空值,只有false和true,不像包装类型似的,可以有空值。因为调用时,没有仔细观察内部实现导致错误。
总结:当包装类型拆箱赋给基本类型变量时,一定要注意包装类型是否会为空值,如果是空值,会报错,java.lang.NullPointerException: cannot unbox null value。因为基本类型不允许为null。
如下: