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