FindBugs 是由馬里蘭大學提供的一款開源 Java靜態代碼分析工具。FindBugs經過檢查類文件或 JAR文件,將字節碼與一組缺陷模式進行對比從而發現代碼缺陷,完成靜態代碼分析。FindBugs既提供可視化 UI 界面,同時也能夠做爲 Eclipse插件使用。文本將主要使用將 FindBugs做爲 Eclipse插件。在安裝成功後會在 eclipse中增長 FindBugs perspective,用戶能夠對指定 Java類或 JAR文件運行 FindBugs,此時 FindBugs會遍歷指定文件,進行靜態代碼分析。java
一:如何安裝安全
安裝步驟:dom
1.點擊「Help->InstallNew Software」,以下圖:eclipse
2.點擊「Add」,而後在彈出框「Name」輸入「findBugs」,「Location」輸入「http://findbugs.cs.umd.edu/eclipse」,點擊「OK」,以下圖:工具
3.選擇對應插件,而後點擊「next->next->finish」。測試
4.完成安裝以後重啓eclipse,右擊項目文件或目錄,會發現多了Findbugs的菜單,以下圖:ui
固然也能夠直接從http://download.csdn.net/detail/hailshao/6593725下載,而後將文件複製到你本地eclipse的plugins目錄,而後重啓eclipse便可spa
二:如何使用.net
1, 在eclipse package Explorer 右鍵選擇目標工程-> build project插件
2, 選擇指定的包或者類進行findbug
3,添加findbugs explorer (eclipse 左下角)
4, bugs explorer 添加完畢後,咱們就能夠查看剛剛找到的bugs了
技巧使用:
找出的bug有3中顏色, 黑色的臭蟲標誌是分類, 紅色的臭蟲表示嚴重bug發現後必須修改代碼,橘黃色的臭蟲表示潛在警告性bug 儘可能修改。(附錄是各類bug的解釋及修改方案,請你們按附表參考修改)
雙擊bug項目就能夠在右邊編輯窗口自動打開相關代碼文件並鏈接到代碼片斷。 點擊行號旁邊的小臭蟲圖標後再eclipse下方輸出區將提供詳細的bug描述,以及修改建議等信息。咱們能夠根據此信息進行修改。
附錄:
代碼檢查常見問題及解決方法
注:如下解決方法爲參考辦法,若是有更好的解決辦法歡迎提出,咱們共同改進。
序號 |
問題英文描述 |
問題分析 |
解決辦法 |
1 |
Comparison of String objects using == or != |
比較字符串使用了雙等號 |
使用String的equels()方法 |
2 |
Call to equals() comparing different types |
Equals方法比較了兩個不一樣的數據類型 |
轉換類型後比較 |
3 |
Call to method of static java.text.DateFormat |
同一個format 屢次調用會致使線性不安全, private static final SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 方法體內調用: format.format(new Date()); |
在方法體內使用,儘可能避免定義全局的對象 format.format(new Date()); |
4 |
Bad attempt to compute absolute value of signed 32-bit random integer |
String nums = Math.abs(r.nextInt()) + ""; |
修改成String nums = Math.abs(r.nextInt(Integer.MAX_VALUE)) + ""; |
5 |
The class name com.aisino.fpcxbd.action.printAction doesn't start with an upper case letter |
類名首字母大寫 |
類名首字母大寫 |
6 |
Dead store to rePacket |
不被使用的變量或常量 |
看業務是否會使用,若是不使用,請刪除,若是有使用,初始值不要直接new 一個對象,初始值能夠置爲null |
7 |
Exception is caught when Exception is not thrown |
沒有拋出異常時,異常被捕獲
|
結合業務進行處理 |
8 |
Load of known null value |
填充了空值 |
若是沒有的空值,請刪除 |
9 |
Method invokes inefficient new String(String) constructor |
方法中調用了低效的new String()構造方法,如 context.put("name",new String("Velocity") ); |
若是內容自己爲字符串,則直接賦值便可,如 context.put("name","Velocity" ); |
10 |
Method may fail to close stream |
方法可能未關閉stream,方法產生了一個IO流,卻未關閉,將會致使文件描繪符的泄漏。 |
建議使用finally block來確保io stream被關閉。若是無異常,請使用完畢後關閉IO流。 |
11 |
Method might ignore exception |
捕捉了異常,可是沒有進行處理 |
須要在catch體中對異常進行處理。或者打印相關的描述。 |
12 |
Method names should start with a lower case letter |
方法首字母沒有小寫, 沒有遵循Java命名規範 |
請將方法首字母小寫 |
13 |
Method uses the same code for two branches |
例如: fpkjmx.setSyl(fpkjmx.getSyl()); |
請確認該寫法是否有意義。 |
14 |
Non-transient non-serializable instance field in serializable class |
在可序列化的類中存在不能序列化或者不能暫存的數據
|
將屬性對象實現可實例化 |
15 |
Null pointer dereference |
會出現空指針,如 if(null != nsrxx){ }else{ nsrxx.setLoginZt(3); } |
這種邏輯有明顯的錯誤,請根據業務修改 |
16 |
Nullcheck of value previously dereferenced |
會出現空指針異常 |
先作非空判斷,再進行業務邏輯的處理,避免空指針異常 |
17 |
Possible null pointer dereference |
可能會出現空指針異常 |
請根據業務處理,若有必要先作非空判斷 |
18 |
Possible null pointer dereference in method on exception path |
在異常部分放棄null值檢查,可能會致使後面的代碼出現空指針異常 |
請根據業務進行處理 |
19 |
Redundant nullcheck of value known to be non-null |
該對象已不爲空,沒有必要再作非空判斷 |
沒有必要的判斷去掉便可,(根據實際業務) |
20 |
Redundant nullcheck of value known to be non-null |
已知該對象爲空,沒有必要再作非空判斷 |
已知該對象爲空,沒有必要再作非空判斷 |
21 |
Repeated conditional tests |
重複條件測試 |
重複的判斷,請去掉一個 |
22 |
Self assignment of local variable |
自賦值的局部變量 |
請檢查代碼,是否能夠去掉自賦值 |
23 |
Should be a static inner class |
應該定義爲靜態內部類 |
若是出現該提示,請定義爲靜態內部類 |
24 |
Store of non serializable object into HttpSession |
在HttpSession中存放非序列化的對象
|
將Javabean實現可實例化 |
25 |
Unread field |
未被使用的變量或對象 |
請查看代碼,若是沒有引用,請刪除或者註釋掉 |