优秀程序员必备素质——快速调试
你是否有過這些經(jīng)歷:
1.代碼敲完了,剛想松口氣,一運(yùn)行程序,滿滿的Bug。
2.找啊找啊找,怎么找都找不到哪里出了問題。
3.調(diào)試了半天出不來,就開始便得心煩氣躁。
4.一天連一個(gè)Bug也沒調(diào)出來,工作效率低,心情抑郁。
5.想著有人可以告訴它如何改善現(xiàn)狀,提高工作效率
……
?
?? 如果你有些經(jīng)歷,那么請接著往下看,雖然不能保證完全解決您現(xiàn)在所面臨的問題,但是也可以讓你工作起來輕松一些。
?
?? 對于我們調(diào)試效率低的這種情況,我們想要提高工作效率,就需要縮短調(diào)試的時(shí)間,即要快速調(diào)試,要想真正學(xué)會(huì)快速調(diào)試,我們需要做到以下四步驟:冷靜,學(xué)會(huì)看異常信息,分析異常,總結(jié)。
?
??第一步:保持冷靜
?? 這是我們調(diào)試時(shí)最為需要的,調(diào)整好心態(tài)是我們做好每一件事情的開端。
?
??錯(cuò)誤的做法:一遇到Bug就心浮氣躁,覺得Bug很討厭,心煩,于是心不甘情不愿的開始了調(diào)試。
?
??正確的做法:先冷靜,然后想我們能夠遇到Bug就說明我們寫的代碼還不夠完美,還有可以改進(jìn)的空間,還在我們的掌控范圍之內(nèi)(不至于等產(chǎn)品發(fā)布后再出現(xiàn)Bug挨老板罵),這是好事兒,這樣想著想著我們的心情也就跟著好了,給我們調(diào)試帶來了好的開頭。
?
??第二步:學(xué)會(huì)看異常信息
?? 靜下心來后,我們就開始看程序給我們所拋出的異常,一般情況下,通過異常信息我們可以確定拋異常的位置和拋異常原因,比如我們以下面這個(gè)異常為例,這個(gè)是我們經(jīng)常會(huì)碰到的異常,我們先來看異常信息:
?
?? 我們先看上面異常信息中的異常描述:“java.lang.NullPointerException”,空指針異常,說明是程序中某處出現(xiàn)了空指針導(dǎo)致的;
?
?? 接著我們看打印出異常的堆棧信息,有些或許看不懂沒關(guān)系,我們只看我們自己代碼部分即可,其中用紅色框標(biāo)出的幾行代碼即為本次異常執(zhí)行時(shí)所經(jīng)過的幾個(gè)類和方法,在這里我們確定了是在根據(jù)用戶id查找用戶時(shí)出現(xiàn)的異常。
?
?? 注:程序打印的異常信息都是堆棧信息,即它的打印順序跟我們程序的執(zhí)行順序是相反的,比如上面例子中的根據(jù)用戶id查找用戶方法,應(yīng)該是先執(zhí)行RoleManagerImp,然后是RoleDaoImpl,最后是BaseDao,可是打印順序確實(shí)BaseDao——RoleDaoImpl——RoleManagerImpl,要會(huì)看這些信息。
?
??第三步:分析異常
?? 該步驟是縮短調(diào)試時(shí)間的關(guān)鍵。確定了異常的幾個(gè)位置后(目前可能出現(xiàn)Bug的位置有四個(gè),RoleManagerAction,RoleManagerImpl,RoleDaoImpl和BaseDao都有可能),我們再來進(jìn)一步分析Bug出現(xiàn)的原因和精確其所在位置。
?
?? 由于異常往往是在最后執(zhí)行時(shí)才會(huì)拋出的,所以我們從后面Dao層入手,我們先查看BaseDao的get方法,可以發(fā)現(xiàn)其指定調(diào)用HibernateTemplate時(shí)有兩個(gè)參數(shù):entityClass和id,而RoleDaoImpl只傳進(jìn)去了一個(gè)id,并且baseDao的entityClass沒有賦值,故而會(huì)有空指針。
?
?? 當(dāng)然我們只是猜測,現(xiàn)在來驗(yàn)證一下,在RoleDaoImpl中為baseDao的entityClass進(jìn)行賦值:
public RolefindRoleById(Long roleId) {
baseDao.setEntityClass(Role.class);
returnbaseDao.get(roleId);
}
?? 再次執(zhí)行,成功無異常,該Bug解決。
?
??第四步:總結(jié)
?? 這一步很重要,不僅對我們以后的調(diào)試效率會(huì)有大大的提高,而且還可以避免我們再次遇到類似的Bug,這就是所謂的項(xiàng)目經(jīng)驗(yàn)。
?
?? 我們對異常出現(xiàn)的情況進(jìn)行分類匯總,一是在下次編碼的時(shí)候避免犯類似錯(cuò)誤,二是讓我們遇到異常時(shí)可以不看異常信息就知道原因,比如針對上面的例子,一看報(bào)了空指針的異常,那么我們不看信息也可以確定不是roleId異常就是baseDao相關(guān)異常,進(jìn)而再通過分析和測試進(jìn)行排除。
?
?? 愚蠢的人是一遍又一遍地犯同樣的錯(cuò),而聰明的人則會(huì)通過總結(jié)和借鑒來避免犯類似的錯(cuò)誤進(jìn)而可以提高。
?
?? 上面這些步驟是我們平時(shí)積累的方法,“工欲善其事必先利其器”,一個(gè)好的方法才能幫助我們?nèi)ジ玫奶岣吆统砷L。
?
?? 如果你積累的比較多之后可以回答一下下面這個(gè)問題,是一個(gè)面試題:一個(gè)網(wǎng)頁運(yùn)行的很慢,如何快速地解決該問題?從哪些方面入手呢?大家踴躍發(fā)言哈!
總結(jié)
以上是生活随笔為你收集整理的优秀程序员必备素质——快速调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java14章总结
- 下一篇: 潜藏在人体体内的12种毒素