當前位置:
首頁 > 知識 > 提高代碼質量—FindBugs代碼審查工具

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

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

一、什麼是FindBugs

FindBugs 是一個靜態分析工具,它檢查類或者 JAR 文件,將位元組碼與一組缺陷模式進行對比以發現可能的問題。它可以簡單高效全面地幫助我們發現程序代碼中存在的bug,bad smell,以及潛在隱患。針對各種問題,它並且提供了簡單的修改意見供我們重構時進行參考; 通過使用它,可以一定程度上降低我們code review的工作量,並且會提高review效率。 通過findbugs找到bug,再由我們自己重構代碼,可以培養我們的編碼意識及水平,形成好的習慣提高開發編碼能力

二、安裝FindBugs

點擊「Help->InstallNew Software」,如下圖:

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

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

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

三、 怎麼使用

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

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

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

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

找出的bug有3種顏色,

黑色的臭蟲標誌是分類。

紅色的臭蟲表示嚴重bug發現後必須修改代碼。

橘黃的臭蟲表示潛在警告性bug 盡量修改。

雙擊bug項目就可以在右邊編輯窗口自動打開相關代碼文件並連接到代碼片段。 點擊行號旁邊的小臭蟲圖標後再eclipse下方輸出區將提供詳細的bug描述,以及修改建議等信息。我們可以根據此信息進行修改。

四、問題發現的例子

忽略方法返回值

這個檢測器查找代碼中忽略了不應該忽略的方法返回值的地方。這種情況的一個常見例子是在調用 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 命令規範的測試:變數名稱不應太短;方法名稱不應過長;類名稱應當以小寫字母開頭;方法和欄位名應當以小寫字母開頭,等等。

未使用的代碼檢查

查找從未使用的私有欄位和本地變數、執行不到的語句、從未調用的私有方法,等等。

嵌套檢查

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

導入語句檢查

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

JUnit 測試檢查

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

字元串檢查

找出處理字元串時遇到的常見問題,例如重複的字元串標量,調用 String 構造函數,對 String 變數調用 toString() 方法。

括弧檢查

檢查 for、 if、 while 和 else 語句是否使用了括弧。

代碼尺寸檢查

測試過長的方法、有太多方法的類以及重構方面的類似問題。

終結函數檢查

因為在 Java 語言中, finalize() 方法不是那麼普遍,它們的使用規則雖然很詳細,但是人們對它們相對不是很熟悉。這類檢查查找 finalize() 方法的各種問題,例如空的終結函數,調用其他方法的 finalize() 方法,對 finalize() 的顯式調用,等等。

克隆檢查

用於 clone() 方法的新規則。凡是重寫 clone() 方法的類都必須實現 Cloneable, clone() 方法應該調用 super.clone(),而 clone() 方法應該聲明拋出 CloneNotSupportedException 異常,即使實際上沒有拋出異常,也要如此。

耦合檢查

查找類之間過度耦合的跡象,比如導入內容太多;在超類型或介面就已經夠用的時候使用子類的類型;類中的欄位、變數和返回類型過多等。

異常檢查

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

日誌檢查

查找 java.util.logging.Logger 的不當使用,包括非終狀態(nonfinal)、非靜態的記錄器,以及在一個類中有多個記錄器。

Open—Close檢查

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

其它檢查

FindBugs 網站提供了完整的 缺陷清單及說明。

構建自己的規則集

可以構建自己的規則集

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

數據抽取清洗轉換載入工具ETL
使用KETTLE從mysql同步增量數據到oracle

TAG:程序員小新人學習 |