上周五程序中出现了一个空指针的异常,由于是界面程序,平常出异常也没事,但是由于这个空指针异常出现在我一个对话框的close方法里面,导致对话框无法关闭,这就是个大问题了。
首先我的代码写的确实有点问题,需求是在关闭对话框时进行某些操作,我将操作放在close方法开头,在close方法最后才调用super.close方法来关闭窗口,这样就导致上面的代码出现异常,super.close关闭对话框不会运行,所以对话框无法关闭,而且我之前也没考虑到哪里会出现空指针,实际操作中不应该出现空指针的。
出现空指针后,我复现一遍,没复现出来,我看了下代码,没看出什么问题,由于异常打印的异常起点的行数是unknow,所以也没法知道具体是哪行出现的空指针。我跟老大说看不出来哪里出了问题,他经常跟我说“要相信科学”,就是说程序出现过问题,那就代码写的肯定有问题,我又看了一遍,主要用到的就一个page对象,但是这个对象我能保证一定不为null,所以不好确定,后来看了上一层调用的代码,发现传进来的page是一个static变量,这就导致多个实例共用的一个对象,跟我的预期是不一样的,我预期的是A有A的pageA对象,B有B的pageB,这两个page对象虽然是同一个类,但是是不同的实例,我感觉这里出了问题,但是空指针的出现还是不知道原因,后来我看着代码测了几遍,将那个问题复现出来了,打断点一调试发现是page.getTable().refresh()这行代码中的page.getTable()返回null了,原因就是A本来有一个pageA的,但是打开B后,将A的page改成了pageB,pageB.getTable()为null,所以A的close时就出现空指针异常了。
空指针异常不一定是最容易定位的异常,因为如果出现空指针在开发的时候就很容易解决,但在测试阶段出现的空指针肯定是某种特定的情况下出现的,而且项目大了之后,异常的打印信息不一定能具体到代码的哪一行,尤其是一个方法大了之后就更难定位了。出现空指针肯定是在你绝对没有想到的地方,所以在定位空指针的问题时,一定要将怀疑出异常方法中自己所有用到的对象是否为null。