一、常规报空处理
1.核对给的值是否匹配,你赋值的字段是不是要返回的字段
2.若赋值正确,先对对象进行判空处理,判空可以通过对象的size,也可以使用工具类中封装好的方法
if(EmptyUtils.isNotEmpty(person)){
再对数据做赋值或者其他处理
}
3.对象不为空的情况下,还报空指针,就是该属性可能为空的情况了,对属性赋值的时候进行非空处理,推荐使用三元表达式。
Penson person = new Person;
person.setName(teacher.getName() == null ? null : teacher.getName() );
二、嵌套取值报空处理
问题复现:
(代码1)
if(ObjectUtil.isNotEmpty(claimSY)){
再对数据做赋值或者其他处理
}
(代码2)
if(StrUtil.isNotEmpty(claimSY.getPolicyNo()) && StrUtil.isNotEmpty(claimJQ.getPolicyNo()) ){
再对数据做赋值或者其他处理
}
问题描述:运行代码,claimSY.getPolicyNo()报空指针,debug定位到claimSY为空,但是在前面已经对claimSY做过了非空判断,依旧报错空指针。
产生原因:首先,claimSY为空的情况下就不会走代码1,所以在代码2时,再从claimSY中取值就会报空指针了。
解决方案:在代码2中对claimSY做非空处理。
修改如下:
if( ObjectUtil.isNotEmpty(claimSY) && ObjectUtil.isNotEmpty(claimJQ) &&
StrUtil.isNotEmpty(claimSY.getPolicyNo()) && StrUtil.isNotEmpty(claimJQ.getPolicyNo()) ){
再对数据做赋值或者其他处理
}
总结:链式取值需要对每一级取值的对象做非空判断