你是否有过这些经历:
1.代码敲完了,刚想松口气,一运行程序,满满的Bug。
2.找啊找啊找,怎么找都找不到哪里出了问题。
3.调试了半天出不来,就开始便得心烦气躁。
4.一天连一个Bug也没调出来,工作效率低,心情抑郁。
5.想着有人可以告诉它如何改善现状,提高工作效率
……
如果你有些经历,那么请接着往下看,虽然不能保证完全解决您现在所面临的问题,但是也可以让你工作起来轻松一些。
对于我们调试效率低的这种情况,我们想要提高工作效率,就需要缩短调试的时间,即要快速调试,要想真正学会快速调试,我们需要做到以下四步骤:冷静,学会看异常信息,分析异常,总结。
第一步:保持冷静
这是我们调试时最为需要的,调整好心态是我们做好每一件事情的开端。
错误的做法:一遇到Bug就心浮气躁,觉得Bug很讨厌,心烦,于是心不甘情不愿的开始了调试。
正确的做法:先冷静,然后想我们能够遇到Bug就说明我们写的代码还不够完美,还有可以改进的空间,还在我们的掌控范围之内(不至于等产品发布后再出现Bug挨老板骂),这是好事儿,这样想着想着我们的心情也就跟着好了,给我们调试带来了好的开头。
第二步:学会看异常信息
静下心来后,我们就开始看程序给我们所抛出的异常,一般情况下,通过异常信息我们可以确定抛异常的位置和抛异常原因,比如我们以下面这个异常为例,这个是我们经常会碰到的异常,我们先来看异常信息:
我们先看上面异常信息中的异常描述:“java.lang.NullPointerException”,空指针异常,说明是程序中某处出现了空指针导致的;
接着我们看打印出异常的堆栈信息,有些或许看不懂没关系,我们只看我们自己代码部分即可,其中用红色框标出的几行代码即为本次异常执行时所经过的几个类和方法,在这里我们确定了是在根据用户id查找用户时出现的异常。
注:程序打印的异常信息都是堆栈信息,即它的打印顺序跟我们程序的执行顺序是相反的,比如上面例子中的根据用户id查找用户方法,应该是先执行RoleManagerImp,然后是RoleDaoImpl,最后是BaseDao,可是打印顺序确实BaseDao——RoleDaoImpl——RoleManagerImpl,要会看这些信息。
第三步:分析异常
该步骤是缩短调试时间的关键。确定了异常的几个位置后(目前可能出现Bug的位置有四个,RoleManagerAction,RoleManagerImpl,RoleDaoImpl和BaseDao都有可能),我们再来进一步分析Bug出现的原因和精确其所在位置。
由于异常往往是在最后执行时才会抛出的,所以我们从后面Dao层入手,我们先查看BaseDao的get方法,可以发现其指定调用HibernateTemplate时有两个参数:entityClass和id,而RoleDaoImpl只传进去了一个id,并且baseDao的entityClass没有赋值,故而会有空指针。
当然我们只是猜测,现在来验证一下,在RoleDaoImpl中为baseDao的entityClass进行赋值:
public RolefindRoleById(Long roleId) {
baseDao.setEntityClass(Role.class);
returnbaseDao.get(roleId);
}
再次执行,成功无异常,该Bug解决。
第四步:总结
这一步很重要,不仅对我们以后的调试效率会有大大的提高,而且还可以避免我们再次遇到类似的Bug,这就是所谓的项目经验。
我们对异常出现的情况进行分类汇总,一是在下次编码的时候避免犯类似错误,二是让我们遇到异常时可以不看异常信息就知道原因,比如针对上面的例子,一看报了空指针的异常,那么我们不看信息也可以确定不是roleId异常就是baseDao相关异常,进而再通过分析和测试进行排除。
愚蠢的人是一遍又一遍地犯同样的错,而聪明的人则会通过总结和借鉴来避免犯类似的错误进而可以提高。
上面这些步骤是我们平时积累的方法,“工欲善其事必先利其器”,一个好的方法才能帮助我们去更好的提高和成长。
如果你积累的比较多之后可以回答一下下面这个问题,是一个面试题:一个网页运行的很慢,如何快速地解决该问题?从哪些方面入手呢?大家踊跃发言哈!