【原創(chuàng)文章沦泌,轉載請注明原文章地址,謝謝辛掠!】
一谢谦、什么是FindBugs
FindBugs 是一個靜態(tài)分析工具,它檢查類或者 JAR 文件萝衩,將字節(jié)碼與一組缺陷模式進行對比以發(fā)現可能的問題回挽。它可以簡單高效全面地幫助我們發(fā)現程序代碼中存在的bug,bad smell欠气,以及潛在隱患厅各。針對各種問題,它并且提供了簡單的修改意見供我們重構時進行參考预柒; 通過使用它队塘,可以一定程度上降低我們code review的工作量袁梗,并且會提高review效率。 通過findbugs找到bug憔古,再由我們自己重構代碼遮怜,可以培養(yǎng)我們的編碼意識及水平,形成好的習慣提高開發(fā)編碼能力
二鸿市、安裝FindBugs
點擊“Help->InstallNew Software”锯梁,如下圖:
在Name中輸入findBugs
, 在Location中輸入:http://findbugs.cs.umd.edu/eclipse
三、 怎么使用
安裝好插件后,選擇指定的包或者類進行Find Bugs
打開Window-->Show View-->Bug Explore,就可以開到bug列表了.
找出的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ī)則集