最近在开发的时候遇到一个疑难杂症
接口在测试环境调用时,出现了空指针异常,于是测试小哥给我们提了一个 Bug 单,然后发现了一个很可怕的问题,我们在开发环境、本地环境都无法复现这个 BUG
于是进容器调取了报错日志,发现了同事的一段代码使用了反射获取字段,异常就是在第4行抛出的
Field[] field = PatientResDTO.class.getDeclaredFields();
for (int i = 0; i < file.length; i++) {
ApiModelProperty aa = file[i].getAnnotation(ApiModelProperty.class);
map.put(file[i].getName(), aa.value());
}
进一步把获取到的成员在测试环境打印出来发现,字段里面莫名的多出了一个 $jacocoData 字段,由于这个字段的 name 属性是空的,导致直接 getName() 出现了空指针异常
原因:
测试环境的流水线中嵌入了自动化测试框架 jacoco,在启动了 jacoco 后,DTO 类里面里插码了 $jacocoData 属性
解决办法:
具体的解决方案需要根据业务逻辑处理,在我们的业务场景下,解决方法是判断 field.getName() 为空的话不做处理
总结:
其实还是要在编程的时候养成良好的习惯,对 get() 操作等要做良好的处理,保证程序的健壮性