「疑难杂症」- 测试环境空指针异常,其他环境无法复现,原来是反射没有处理好

940 阅读1分钟

最近在开发的时候遇到一个疑难杂症

接口在测试环境调用时,出现了空指针异常,于是测试小哥给我们提了一个 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() 操作等要做良好的处理,保证程序的健壮性