`
53873039oycg
  • 浏览: 824442 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

记一次工作中空指针故障的处理

阅读更多

     今天上班的时候收到邮件,内容是我负责的代码报错了,时间很紧,必须今天内找出错误原因并修改,不能影响今天的业务数据,我一听马上想怎么可能,项目上线已经4个月了,运行这么久都没错,错误还得处理。

    错误信息如下:

   

java.lang.NullPointerException
	at com.xxx.saveXXX(XXXDAOImpl.java:20)

     典型的空指针,首先找到第20行,第20行是一个save方法,没看出问题,往上面看,只有几个set方法,也没看出问题,而且上面的几个属性除了主键大部分是可以接收null值的,业务需要不同的操作有不同的字段对应,有些业务只需要也只能记录到几个属性。

 

     没办法,在eclipse里面选择方法名按Ctrl+Alt+H得到方法调用关系,最终在Service里面找到最初的调用方法,一开始我百分百以为自己的代码出问题了,这玩意出问题了后果很严重,先把代码从service到dao看了一遍又一遍,一无所获,心里很失落。  

 

      看代码没看出问题,只好模拟下,希望能找出错误原因,好在数据库里面有测试数据,先那点测试数据跑下,在出错位置打上断点,debug运行,第一次取了10条,一跑没错,查看数据库确实跑成功了,以为是数据太少,第二次取了200条,在出错位置打印对象信息,run运行,一下跑成功了,看数据库确实是成功了,难道是人品不行。

 

      代码也看了,也运行了,就是找不到错误原因,这感觉,中午休息了下,下午继续找原因,一开始我怀疑有人修改过我的代码,这不是我第一反应想到的,我第一反应是:"糟了,代码出错了,要马上找到bug位置",查看svn提交信息,上面只有我的名字,按邮件说错误是昨天凌晨时候发生的,以前没错误,只好出绝招了,去生产数据库查询前天0点开始到前天12点的数据,为什么呢?我写的是一个今天处理昨天数据的功能,错误是昨天时候发生的,所以只需要查看前天的数据,按出错时间估计,任务最多只处理一半,只需要一半的数据。

 

      把数据从生产取到本地,我做的工作是,(一)修改代码,在出错位置增加打印信息,(二)把取数据的逻辑修改成支持按时间段取数据。这样我从0时开始,一个小时取一次数据处理。(三)在service方法内用try,catch捕获异常,以前是直接抛出的,等上面代码处理的,我这样做只是想快点找到出错原因,另一方面是我的serice是提供给别人的,我的测试方法只能写在service里面,还是使用main方法测试的,原因是我想快点运行,看过我以前的博客的朋友也许知道,我电脑上的junit run方法半天没反应。 

 

 

     这样我从0点到1点,运行正常,1点到2点时间段运行正常,3点到4点时间段出错了,在出错信息上面,我成功得到了对象的id以及其他信息。 到生产数据库一查询,结果让我非常激动,QTDYD,结果是那条数据对应的信息上面明显的写着测试的字样,让我情何以堪,是上线时候测试数据没清空干净留下的。

 

     后面的处理也顺理成章了,(一)查询表看是否还有其他测试数据,(二)删除测试数据,其他的坐等明天结果,我相信我写的代码。

 

     这次找错非常侥幸,原因是(一)我能拿到生产数据,这是最重要的,如果仅凭错误信息,还是空指针,而且程序几个月没出错过,出错部分代码几个月没修改过,没有真实数据怎么找错呢?(二)是我的代码关系简单,没有被几个模块调用过,出错位置非常明确。

 

      结论是:关键还得看数据。

 

      最近有朋友问我上班不积极,上班时间写博客,我想回应下,我喜欢有感觉的时候马上把它写出来,上班时候我也会抽空写,不然我一下忘了,我更喜欢在问题被我解决时候写篇博文纪念下。第三,我上班的时候可以上网,公司没限制。

     全文完。

 

 

 

 

 

   

3
0
分享到:
评论
2 楼 53873039oycg 2014-03-08  
seandeng888 写道
测试数据也能上生产啊!

上线前在生产数据库测试时候没删干净。
1 楼 seandeng888 2014-03-08  
测试数据也能上生产啊!

相关推荐

Global site tag (gtag.js) - Google Analytics