提高代碼質量—FindBugs代碼審查工具

【原創(chuàng)文章沦泌,轉載請注明原文章地址,謝謝辛掠!】

FindBugs.png
一谢谦、什么是FindBugs

FindBugs 是一個靜態(tài)分析工具,它檢查類或者 JAR 文件萝衩,將字節(jié)碼與一組缺陷模式進行對比以發(fā)現可能的問題回挽。它可以簡單高效全面地幫助我們發(fā)現程序代碼中存在的bug,bad smell欠气,以及潛在隱患厅各。針對各種問題,它并且提供了簡單的修改意見供我們重構時進行參考预柒; 通過使用它队塘,可以一定程度上降低我們code review的工作量袁梗,并且會提高review效率。 通過findbugs找到bug憔古,再由我們自己重構代碼遮怜,可以培養(yǎng)我們的編碼意識及水平,形成好的習慣提高開發(fā)編碼能力

二鸿市、安裝FindBugs

點擊“Help->InstallNew Software”锯梁,如下圖:

Paste_Image.png

在Name中輸入findBugs , 在Location中輸入:http://findbugs.cs.umd.edu/eclipse

Paste_Image.png
三、 怎么使用

安裝好插件后,選擇指定的包或者類進行Find Bugs

Paste_Image.png

打開Window-->Show View-->Bug Explore,就可以開到bug列表了.

Paste_Image.png

找出的bug有3種顏色焰情,
黑色的臭蟲標志是分類陌凳。
紅色的臭蟲表示嚴重bug發(fā)現后必須修改代碼。
橘黃的臭蟲表示潛在警告性bug 盡量修改内舟。
雙擊bug項目就可以在右邊編輯窗口自動打開相關代碼文件并連接到代碼片段合敦。 點擊行號旁邊的小臭蟲圖標后再eclipse下方輸出區(qū)將提供詳細的bug描述,以及修改建議等信息验游。我們可以根據此信息進行修改充岛。

四、問題發(fā)現的例子

忽略方法返回值
這個檢測器查找代碼中忽略了不應該忽略的方法返回值的地方耕蝉。這種情況的一個常見例子是在調用 String方法時:
忽略返回值的例子

String aString = "bob"; 
b.replace('b', 'p'); 
if(b.equals("pop"))

這個錯誤很常見崔梗。在第 2 行,程序員認為他已經用 p 替換了字符串中的所有 b垒在。確實是這樣蒜魄,但是他忘記了字符串是不可變的。所有這類方法都返回一個新字符串场躯,而從來不會改變消息的接收者权悟。

Null 指針示例

Person person = aMap.get("bob"); 
if (person != null) {
    person.updateAccessTime();
} 
String name = person.getName();

在這個例子中,如果第 1 行的 Map不包括一個名為“bob”的人推盛,那么在第 5 行詢問 person的名字時就會出現 null 指針異常。因為 FindBugs 不知道 map 是否包含“bob”谦铃,所以它將第 5 行標記為可能 null 指針異常耘成。

初始化之前讀取字段
這個檢測器尋找在構造函數中初始化之前被讀取的字段。這個錯誤通常是——盡管不總是如此——由使用字段名而不是構造函數參數引起的驹闰。
在構造函數中讀取未初始化的字段

public class Thing {
    private List actions;
    public Thing(String startingActions) {
          StringTokenizer tokenizer = new StringTokenizer(startingActions);         
          while (tokenizer.hasMoreTokens()) {             
                actions.add(tokenizer.nextToken());
          }
    }
}

在這個例子中瘪菌,第 6 行將產生一個 null 指針異常,因為變量 actions還沒有初始化.

命名檢查
對標準 Java 命令規(guī)范的測試:變量名稱不應太短嘹朗;方法名稱不應過長师妙;類名稱應當以小寫字母開頭;方法和字段名應當以小寫字母開頭屹培,等等默穴。

未使用的代碼檢查
查找從未使用的私有字段和本地變量怔檩、執(zhí)行不到的語句、從未調用的私有方法蓄诽,等等薛训。

嵌套檢查
例如: switch 語句應當有 default 塊,應當避免深度嵌套的 if 塊仑氛,不應當給參數重新賦值乙埃,不應該對 double 值進行相等比較。

導入語句檢查
檢查 import 語句的問題锯岖,比如同一個類被導入兩次或者被導入 java.lang 的類中介袜。

JUnit 測試檢查
查找測試用例和測試方法的特定問題,例如方法名稱的正確拼寫出吹,以及 suite() 方法是不是 static 和 public遇伞。

字符串檢查
找出處理字符串時遇到的常見問題,例如重復的字符串標量趋箩,調用 String 構造函數赃额,對 String 變量調用 toString() 方法。

括號檢查
檢查 for叫确、 if跳芳、 while 和 else 語句是否使用了括號。

代碼尺寸檢查
測試過長的方法竹勉、有太多方法的類以及重構方面的類似問題飞盆。

終結函數檢查
因為在 Java 語言中, finalize() 方法不是那么普遍次乓,它們的使用規(guī)則雖然很詳細吓歇,但是人們對它們相對不是很熟悉。這類檢查查找 finalize() 方法的各種問題票腰,例如空的終結函數城看,調用其他方法的 finalize() 方法,對 finalize() 的顯式調用杏慰,等等测柠。

克隆檢查
用于 clone() 方法的新規(guī)則。凡是重寫 clone() 方法的類都必須實現 Cloneable缘滥, clone() 方法應該調用 super.clone()轰胁,而 clone() 方法應該聲明拋出 CloneNotSupportedException 異常,即使實際上沒有拋出異常朝扼,也要如此赃阀。

耦合檢查
查找類之間過度耦合的跡象,比如導入內容太多擎颖;在超類型或接口就已經夠用的時候使用子類的類型榛斯;類中的字段观游、變量和返回類型過多等。

異常檢查
針對異常的檢查:不應該聲明該方法而拋出 java.lang.Exception 異常肖抱,不應當將異常用于流控制备典,不應該捕獲 Throwable,等等意述。

日志檢查
查找 java.util.logging.Logger 的不當使用提佣,包括非終狀態(tài)(nonfinal)、非靜態(tài)的記錄器荤崇,以及在一個類中有多個記錄器拌屏。

Open—Close檢查
檢查文件或通訊方面,是否忘記Close的情況术荤。

其它檢查
FindBugs 網站提供了完整的 缺陷清單及說明倚喂。

構建自己的規(guī)則集
可以構建自己的規(guī)則集

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓣戚,隨后出現的幾起案子端圈,更是在濱河造成了極大的恐慌,老刑警劉巖子库,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舱权,死亡現場離奇詭異,居然都是意外死亡仑嗅,警方通過查閱死者的電腦和手機宴倍,發(fā)現死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仓技,“玉大人鸵贬,你說我怎么就攤上這事〔蹦恚” “怎么了阔逼?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長地沮。 經常有香客問我颜价,道長,這世上最難降的妖魔是什么诉濒? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮夕春,結果婚禮上未荒,老公的妹妹穿的比我還像新娘。我一直安慰自己及志,他們只是感情好片排,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布寨腔。 她就那樣靜靜地躺著,像睡著了一般率寡。 火紅的嫁衣襯著肌膚如雪迫卢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天冶共,我揣著相機與錄音乾蛤,去河邊找鬼。 笑死捅僵,一個胖子當著我的面吹牛家卖,可吹牛的內容都是我干的。 我是一名探鬼主播庙楚,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼上荡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馒闷?” 一聲冷哼從身側響起酪捡,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纳账,沒想到半個月后逛薇,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡塞祈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年金刁,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片议薪。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡尤蛮,死狀恐怖,靈堂內的尸體忽然破棺而出斯议,到底是詐尸還是另有隱情产捞,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布哼御,位于F島的核電站坯临,受9級特大地震影響,放射性物質發(fā)生泄漏恋昼。R本人自食惡果不足惜看靠,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望液肌。 院中可真熱鬧挟炬,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粥喜,卻和暖如春凸主,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背额湘。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工卿吐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缩挑。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓但两,卻偏偏與公主長得像,于是被迫代替她去往敵國和親供置。 傳聞我的和親對象是個殘疾皇子谨湘,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容

  • 1 enum不能用作 變量名 備注:java 5以后enum是關鍵字 2 equals(obj)和hashCode...
    落落落落大大方方閱讀 987評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,310評論 25 707
  • 我越來越相信天意,總會在某個拐點讓某個人為你指明方向芥丧,選擇道路紧阔,而這個道路往往成就了你,或者并不使你后悔续担。上天是眷...
    嘻嘻媽媽是老師閱讀 209評論 0 0
  • 關上燈擅耽,打開蝦米音樂,躺在床上已經快三個小時了物遇。思緒來回飄蕩乖仇,從南到北,從東到西询兴。這個時候的溫度還是有點兒濕熱乃沙,但...
    魚小小是小小魚閱讀 131評論 0 0
  • 李鴻睿閱讀 309評論 0 0