公司人员报告了获取任务列表为500的bug,但是我们测试数据却能正常返回。玄学?NO!NO!NO!

BUG情况

公司人员报告了一个bug,获取我们用户任务列表的接口数据时会出现500的异常。但是经过我们自己测试没有发现问题。

几天后,公司人员又发来了截图,表示获取任务列表又出现了500异常。并且测试过后发现只有userid是6的才会出现500异常,其他userid不会出现,并且userid为6的用户调用这个接口,时而能够正常返回数据,时而又出现500bug。

原因

经过查看项目log发现程序运行过程中出现了空指针异常。并且定位到相关的代码行。

1
long sl = user.getFinishTime().getTime() - user.getCreateTime().getTime();

(不要问为什么任务的变量名是user,我也不知道。。。)小伙伴写这段代码时是通过获取到任务的finishTime,再拿finishTime减去createTime

初步猜想可能是新创建的任务没有finish,导致获取到的finishTimenull。因此引发空指针异常。

而当用户的任务完成时,finishTime被填上,再获取任务列表时,又可以正常获取到数据。

又因为公司那边测试一直用的是同一个用户id(6),所以每次创建任务之后获取任务列表,显示是500.其他用户id并没有运行任务,所以表象是只有userid为6的用户才会发生异常。

进一步查看log,佐证了自己的猜想。

500bug
500bug

log显示在查询用户列表之前,用户新创建了一个任务。

总结

虽问题不是什么大问题,代码也不是自己写的,但有两点须引以为戒。

  1. 变量名的规范:任务记录的对象,命名为user,让我在定位bug的时候,理解代码出现了偏差。所以变量命名规范,有助于对代码快速的理解,从而能够更快的定位bug。
  2. 注释:太重要了!!!如果不写注释,等出现bug再定位的时候,再次读即使是自己写的代码,也会耗费些时间来理解。