優秀程序員必備素質 - 快速調試
你是否有過這些經歷:
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相關異常,進而再通過分析和測試進行排除。
愚蠢的人是一遍又一遍地犯同樣的錯,而聰明的人則會通過總結和借鑒來避免犯類似的錯誤進而可以提高。
上面這些步驟是我們平時積累的方法,“工欲善其事必先利其器”,一個好的方法才能幫助我們去更好的提高和成長。
如果你積累的比較多之后可以回答一下下面這個問題,是一個面試題:一個網頁運行的很慢,如何快速地解決該問題?從哪些方面入手呢?大家踴躍發言哈!
轉自:http://blog.csdn.net/zhaodandan19910306/article/details/7628879