CheckStyle 、FindBugs和PMD的安裝與使用_第1頁
CheckStyle 、FindBugs和PMD的安裝與使用_第2頁
CheckStyle 、FindBugs和PMD的安裝與使用_第3頁
CheckStyle 、FindBugs和PMD的安裝與使用_第4頁
CheckStyle 、FindBugs和PMD的安裝與使用_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、CheckStyle 、FindBugs和PMD一、 三個插件的安裝方法一:1. Eclipse中,選擇Help->Install New Software2.點擊Add來新增一個安裝 3.輸入安裝名稱和地址a) CheckStyle: b) Findbugs:/eclipsec) PMD:如果安裝地址不對,會報錯,如下圖:如果安裝地址正確,如下:4. 安裝后重啟即可 5.安裝好之后,右擊項目選擇屬性,可以看到安裝是否成功方法二:1.下載eclipse插件下載后,把里面的兩個文件夾plugins和 features下面

2、的文件分別拷貝到eclipse目錄下面對應的plugins和features目錄2.如果你就這樣直接啟動eclipse 可能會出現ClassNotFoundExceptions 等錯誤,所以必須在啟動eclipse的時候加上一個參數 -clean. 這樣eclipse就可以更新它當前安裝的許多插件信息比如你得eclipse在d盤 那么就是 d:eclipseeclipse.exe -clean二、 CheckStyle的介紹和使用1、 介紹 Checkstyle是一款檢查java程序代碼樣式的工具,可以有效的幫助我們檢視代碼以便更好的遵循代碼編寫標準,特別適用于小組開發時彼此間的樣式規范和統一

3、。Checkstyle提供了高可配置性,以便適用于各種代碼規范,所以除了可以使用它提供的sun的代碼標準外,你也可以定制自己的標準。我們可以在eclipse中安裝checkstyle的插件,來方便我們的使用。 Checkstyle可以讓我們養成書寫良好代碼風格的習慣,代碼的整潔也減少了很多bad smell的產生。使用checkstyle的過程中可能需要經常的調整配置文件,有些check過于嚴格,可以根據實際情況取消一些代碼檢查。2、 使用2.1CheckStyle使用樣例I配置好項目的checkstyle屬性II .右擊項目,點擊Checkstyle中的Check code with Che

4、ckstyle選擇某個項目,點擊右鍵選擇“Checkstyle”,會出現如下菜單:1) Configure project(s) from blueprint:指定工程加入Checkstyle檢查;2) Activate Checkstyle:激活Checkstyle;3) Deactivate Checkstyle:取消激活Checkstyle;4) Check code with Checkstyle:使用Checkstyle檢查代碼;5) Clear Checkstyle violations:去掉Checkstyle的檢查提示。6) Create Formatter-Profile:創

5、建格式化文件。III .運行結果選擇“Check code with Checkstyle”對所選中的項目進行檢查,檢查后對有問題的類會使用警告或錯誤標識。參考提示信息如下:                 左側會顯示小圓圈,將鼠標移動到上面時將給出提示信息。  使用Checkstyle后,注釋、變量命名規范性、類中變量、構造函數、方法的順序的檢查、行的長度、文件的長度、方法的長度等都不需要手工進行檢查,只

6、需要在代碼評審時使用Checkstyle檢查即可。因此,讓代碼評審人員將側重點放在Checkstyle檢查不出來的一些代碼的優化問題。IIII . 自己添加規則新建一個文本文檔,保存為xml格式,寫入如下內容:在項目的Checkstyle屬性里,添加自己的規則:選擇使用自己的規則:選中自己的規則:重新運行Check code with Checkstyle:可以看到,當我定義規則if層次最大為3時,如果代碼的if層次超過了3,則會提示錯誤。IIV .Checkstyle violations chart視圖點擊Windows的Perferences下的other項,選中Checkstyle中的

7、Checkstyle violations chart:選擇Checksty violations chart視圖,會把每種不規范的信息做下統計,繪制成圖表:2.2CheckStyle常見錯誤提醒錯誤提示錯誤說明missing a javadoc comment缺少類注釋Line longer than X characters行長度超過X個字符(包括空格)Return count is X(max allowed 3)一個方法內的返回數量是X(最大值只能為3)Nested if-else depth is X(max allowed is 3)最大的if-else嵌套層數為X(最大只能為3)

8、Array brackets at illegal position數組的方括號“”的位置不正確(檢查數組類型的定義是String args,而不是String args)Line matchs the illegal pattern 'System.out.println'本行包含System.out.println語句ctor def modifier at indentation level 8 not at corrent indentation 4縮進不正確,一般是因為沒有在Eclipse中使用4個空格代替tab鍵引起。'static' modifie

9、r out of order with the JLS suggestionsstatic修飾符沒有按照JLS的建議來排序(eg.寫成public final static.應該改成public static final)Name 'X' must match pattern 'A-ZA-Z0-9_A-Z0-9+$'(正則表達式)名稱不符合正則表達式'A-ZA-Z0-9_A-Z0-9+$'(即為大寫字母,數字、下劃線等)。一般在靜態變量沒有大寫時提示,包名不是全部消息時提示,類名不是大寫開頭時提示,方法名不是小寫開頭時提示Variable acc

10、ess definition in wrong order變量定義順序不正確(例如在類成員變量定義時,將private類型的變量定義在public類型的變量之前)Static variable definition in wrong order靜態變量定義順序不正確(例如在構造函數之后定義靜態變量)Instance variable definition in wrong order成員變量定義順序不正確(例如在構造函數之后定義成員變量)X is a magic numberX是一個魔術數字(非0、1、2的數字)if construct must use ''if結構必須使用&

11、#39;'Got an exception - Unexpected character 0xfffd in identifier因為沒有設置checkstyle配置文件的charset為UTF-8,而類文件使用UTF-8編碼,并且含有中文“” should be on the previous line“” 應該位于前一行Methods is missing a javadoc comment方法前面缺少javadoc注釋Expected throws tag for “Exception”在注釋中希望有throws的說明“.” Is prec

12、eeded with whitespace“.” 前面不能有空格“.” Is followed by whitespace“.” 后面不能有空格“=” is not preceeded with whitespace“=”前面缺少空格“=” is not followed with whitespace“=” 后面缺少空格“” should be on the same line“” 應該與下條語句位于同一行Unused param tag for “unused”沒有參數“unused”,不需注釋Var

13、iable “X” missing javadoc變量“CA”缺少javadoc注釋Line contains a tab character行含有”tab” 字符Redundant “Public” modifier冗余的“public” modifierfinal modifier out of order with the JSL suggestionfinal修飾符的順序錯誤Avoid using the “.*” form of importImport格式避免使用“.*”Redundant import

14、 from the same package從同一個包中Import內容Unused import-X Importimport的X類沒有被使用Duplicate import to line X重復Import同一個內容Import from illegal package從非法包中 Import內容“while” construct must use “”“while” 語句缺少“”Variable “X” must be private and have accessor method變量“X”應該是private的,

15、并且有調用它的方法Variable “X” must match pattern “a-za-zA-Z0-9*$”變量“X”不符合命名規則“a-za-zA-Z0-9*$”“(” is followed by whitespace“(” 后面不能有空格“)” is proceeded by whitespace“)” 前面不能有空格2.3CheckStyle默認提供的檢查內容Javadoc注釋 命名約定 標題 Import語句 體積大小 空白 修飾符  塊&

16、#160;代碼問題 類設計 混合檢查(包活一些有用的比如非必須的 System.out和printstackTrace) 從上面可以看出,CheckStyle提供了大部分功能都是對于代碼規范 的檢查,而沒有提供象PMD和Jalopy那么多的增強代碼質量和修改代碼的功能。但是,對于團隊開發,尤其是強調代碼規范的公司來說,它的功能已經足夠強大。三、 FindBugs的介紹和使用1、 介紹Findbugs是一個在java程序中查找bug的程序,它查找bug模式的實例,也就是可能出錯的代碼實例,注意Findbugs是檢查java字節碼,也就是*.class文件。其實準確的

17、說,它是尋找代碼缺陷的,很多我們寫的不好的地方,可以優化的地方,它都能檢查出來。例如:未關閉的數據庫連接,缺少必要的null check,多余的 null check,多余的if后置條件,相同的條件分支,重復的代碼塊,錯誤的使用了"=",建議使用StringBuffer代替字符串連加等等。而且我們還可以自己配置檢查規則(做哪些檢查,不做哪些檢查),也可以自己來實現獨有的校驗規則(用戶自定義特定的bug模式需要繼承它的接口,編寫自己的校驗類,屬于高級技巧)。2、 使用2.1 Findbugs使用樣例I. 同樣先設置項目的FindBugs屬性當運行插件沒有反應的時候,可能是Mi

18、nimum confidence to report 屬性設置問題,這個屬性是設置報錯等級的,如果設置為Medium,那么Low級別的錯誤則不會提示。a. Run FindBugs Automatically開關當此項選中后,FindBugs將會在你修改Java類時自動運行,如你設置了Eclipse自動編譯開關后,當你修改完Java文件保存,FindBugs就會運行,并將相應的信息顯示出來。當此項沒有選中,你只能每次在需要的時候自己去運行FindBugs來檢查你的代碼。b. Minimum priority to report選擇項這個選擇項是讓你選擇哪個級別的信息進行顯示,有Low、Medi

19、um、High三個選擇項可以選擇,很類似于Log4J的級別設置啦。 比如:你選擇了High選擇項,那么只有是High級別的提示信息才會被顯示。你選擇了Medium選擇項,那么只有是Medium和High級別的提示信息才會被顯示。你選擇了Low選擇項,那么所有級別的提示信息都會被顯示。c. Enable bug categories選擇項在這里是一些顯示Bug分類的選擇:Correctness關于代碼正確性相關方面的Performance關于代碼性能相關方面的Internationalization關于代碼國際化相關方面的Multithreaded correctness關于代碼多線程正確性相關

20、方面的Style關于代碼樣式相關方面的Malicious code vulnerability關于惡意破壞代碼相關方面的比如:如果你把Style的檢查框去掉不選擇中它,那么與Style分類相關的警告信息就不會顯示了。其它的類似。d. Select bug patterns to check for選擇項在這里你可以選擇所要進行檢查的相關的Bug Pattern條目可以從Bug codes、Detector name、Detector description中看到相應的是要檢查哪些方面的內容,你可以根據需要選擇或去掉相應的檢查條件。II. 右擊項目選擇Find Bugs的FindBugs選擇項目

21、,點擊右鍵選擇“Checkstyle”,會出現如下菜單:1) Find Bugs:使用Findbugs代碼中的錯誤;2) Clear Bug Markers:清除bug 標記;3) Save XML:保存XML;4) Open Analysis Results in Editor:在編輯器中打開分析結果;5) Load XML:下載XML。III. 運行結果項目和文件后面括號中的數字代表其包含的錯誤數,在Java文件中,編輯框邊上的綠色瓢蟲代表了低級錯誤,鼠標放在上面會提示錯誤具體信息,同時也可右擊瓢蟲,選擇show bug info 來查看具體錯誤信息。IV. Bugs Info、Bugs

22、Explorer和Bugs Reviewer同樣在Windows的Show View中可以調出Bugs Info、Bugs Explorer和Bugs Reviewer工具調,可以方便查看錯誤信息。 2.2 錯誤詳細說明Findbugs是一個靜態分析工具,它檢查類或者JAR 文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。Findbugs自帶檢測器,其中有60余種Bad practice,80余種Correctness,1種 Internationalization,12種Malicious code vulnerability,27種Multithreaded correctness,

23、23種Performance,43種Dodgy。Bad practice 壞的實踐一些不好的實踐,下面列舉幾個:HE: 類定義了equals(),卻沒有hashCode();或類定義了equals(),卻使用Object.hashCode();或類定義了hashCode(),卻沒有equals();或類定義了hashCode(),卻使用Object.equals();類繼承了equals(),卻使用Object.hashCode()。SQL:Statement 的execute方法調用了非常量的字符串;或Prepared Statement是由一個非常量的字符串產生。DE: 方法終止或不處理異

24、常,一般情況下,異常應該被處理或報告,或被方法拋出。Correctness 一般的正確性問題可能導致錯誤的代碼,下面列舉幾個:NP: 空指針被引用;在方法的異常路徑里,空指針被引用;方法沒有檢查參數是否null;null值產生并被引用;null值產生并在方法的異常路徑被引用;傳給方法一個聲明為NonNull的null參數;方法的返回值聲明為NonNull實際是null。Nm: 類定義了hashcode()方法,但實際上并未覆蓋父類Object的hashCode();類定義了tostring()方法,但實際上并未覆蓋父類Object的toString();很明顯的方法和構造器混淆;方法名容易混淆

25、。SQL:方法嘗試訪問一個Prepared Statement的0索引;方法嘗試訪問一個ResultSet的0索引。UwF:所有的write都把屬性置成null,這樣所有的讀取都是null,這樣這個屬性是否有必要存在;或屬性從沒有被write。Internationalization 國際化當對字符串使用upper或lowercase方法,如果是國際的字符串,可能會不恰當的轉換。Malicious code vulnerability 可能受到的惡意攻擊如果代碼公開,可能受到惡意攻擊的代碼,下面列舉幾個:FI: 一個類的finalize()應該是protected,而不是public的。MS:

26、屬性是可變的數組;屬性是可變的Hashtable;屬性應該是package protected的。Multithreaded correctness 多線程的正確性多線程編程時,可能導致錯誤的代碼,下面列舉幾個:ESync:空的同步塊,很難被正確使用。MWN:錯誤使用notify(),可能導致IllegalMonitorStateException異常;或錯誤的使用wait()。No: 使用notify()而不是notifyAll(),只是喚醒一個線程而不是所有等待的線程。SC: 構造器調用了Thread.start(),當該類被繼承可能會導致錯誤。Performance 性能問題可能導致性能

27、不佳的代碼,下面列舉幾個:DM:方法調用了低效的Boolean的構造器,而應該用Boolean.valueOf();用類似Integer.toString(1) 代替new Integer(1).toString();方法調用了低效的float的構造器,應該用靜態的valueOf方法。SIC:如果一個內部類想在更廣泛的地方被引用,它應該聲明為static。SS: 如果一個實例屬性不被讀取,考慮聲明為static。UrF:如果一個屬性從沒有被read,考慮從類中去掉。UuF:如果一個屬性從沒有被使用,考慮從類中去掉。Dodgy 危險的具有潛在危險的代碼,可能運行期產生錯誤,下面列舉幾個:CI:

28、類聲明為final但聲明了protected的屬性。DLS:對一個本地變量賦值,但卻沒有讀取該本地變量;本地變量賦值成null,卻沒有讀取該本地變量。ICAST: 整型數字相乘結果轉化為長整型數字,應該將整型先轉化為長整型數字再相乘。INT:沒必要的整型數字比較,如X <= Integer.MAX_VALUE。NP: 對readline()的直接引用,而沒有判斷是否null;對方法調用的直接引用,而方法可能返回null。REC:直接捕獲Exception,而實際上可能是RuntimeException。ST: 從實例方法里直接修改類變量,即static屬性。 四、 PMD的介紹和使用1、

29、 介紹PMD是一種開源分析Java代碼錯誤的工具。與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說,在不運行Java程序的情況下報告錯誤。PMD的核心是JavaCC解析器生成器。PMD結合運用JavaCC和EBNF(擴展巴科斯-諾爾范式,Extended Backus-Naur Formal)語法,再加上JJTree,把Java源代碼解析成抽象語法樹(AST,Abstract Syntax Tree)。從根本上看,Java源代碼只是一些普通的文本。不過,為了讓解析器承認這些普通的文本是合法的Java代碼,它們必須符合某種特定的結構要求。這種結構可以用一種稱為EBNF的句法元語言

30、表示,通常稱為“語法” (Grammar)。JavaCC根據語法要求生成解析器,這個解析器就可以用于解析用Java編程語言編寫的程序。 不過實際運行 中的PMD還要經過JJTree的一次轉換。JJTree是一個JavaCC的插件,通過AST擴充JavaCC生成的解析器。AST是一個Java符號 流之上的語義層。有了JJTree,語法分析的結果不再是“System, ., out, ., . println”之類的符號序列,而是一個由對象構成的樹型層次結構。2、 使用2.1 PMD使用樣例I. 配置項目屬性,選擇Enable PMDII. 右擊項目,選擇PMD中的Check Code選

31、擇項目,點擊右鍵選擇“PMD”,會出現如下菜單:1) Generate Reports:生成報告2) Clear Violation Reviews:清除違反檢查3) Find Suspect Cut And Paste:查找可能的剪切粘貼4) Clear Violations:清除違反5) Check Code:檢查代碼III. 運行結果運行完后,會有一個違反大綱:右擊每條違反都可以查看具體違反的規則,例如查看第一條具體信息:IV. 在Windows 的show view 中調出Dataflow View通過Dataflow View 可以查看整段代碼的結構:V. 右擊一個類文件,選擇Gen

32、erate Abstract Syntax Tree可以生成這個類文件的抽象語法樹:2.2PMD 規則說明PMD 包含 16 個規則集,涵蓋了 Java 的各種常見問題,其中一些規則要比其他規則更有爭議:基本(rulesets/basic.xml) 規則的一個基本合集,可能大多數開發人員都不認同它: catch 塊不該為空,無論何時重寫 equals(),都要重寫 hashCode(),等等。命名(rulesets/naming.xml) 對標準 Java 命令規范的測試:變量名稱不應太短;方法名稱不應過長;類名稱應當以小寫字母開頭;方法和字段名應當以小寫字母開頭,等等。未使用的代碼(rule

33、sets/unusedcode.xml) 查找從未使用的私有字段和本地變量、執行不到的語句、從未調用的私有方法,等等。 設計(rulesets/design.xml) 檢查各種設計良好的原則,例如: switch 語句應當有 default 塊,應當避免深度嵌套的 if 塊,不應當給參數重新賦值,不應該對 double 值進行相等比較。 導入語句(rulesets/imports.xml) 檢查 import 語句的問題,比如同一個類被導入兩次或者被導入 java.lang 的類中。 JUnit 測試(rulesets/junit.xml) 查找測試用例和測試方法的特定問題,例如方法名稱的正確

34、拼寫,以及 suite() 方法是不是 static 和 public。 字符串(rulesets/string.xml) 找出處理字符串時遇到的常見問題,例如重復的字符串標量,調用 String 構造函數,對 String 變量調用 toString() 方法。 括號(rulesets/braces.xml) 檢查 for、 if、 while 和 else 語句是否使用了括號。 代碼尺寸(rulesets/codesize.xml) 測試過長的方法、有太多方法的類以及重構方面的類似問題。 Javabean(rulesets/javabeans.xml) 查看 JavaBean 組件是否違反 JavaBean 編碼規范,比如沒有序列化的 bean 類。 終結函數(finalizer) 因為在 Java 語言中, finalize() 方法不是那么普遍(我上次編

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論