提高Java代碼質量的Eclipse插件之Checkstyle的使用詳解


CheckStyle是SourceForge下的一個項目,提供了一個幫助JAVA開發人員遵守某些編碼規范的工具。它能夠自動化代碼規范檢查過程,從而使得開發人員從這項重要但是枯燥的任務中解脫出來。

CheckStyle檢驗的主要內容
·Javadoc注釋
·命名約定
·標題
·Import語句
·體積大小
·空白
·修飾符
·塊
·代碼問題
·類設計
·混合檢查(包活一些有用的比如非必須的System.out和printstackTrace)

從上面可以看出,CheckStyle提供了大部分功能都是對於代碼規范的檢查,而沒有提供象PMD和Jalopy那么多的增強代碼質量和修改代碼的功能。但是,對於團隊開發,尤其是強調代碼規范的公司來說,它的功能已經足夠強大。

Checkstyle插件可以集成到Eclipse IDE中去,能確保Java代碼遵循標准代碼樣式。

一、CheckStyle 安裝方法

方法一:
 
1.Eclipse中,選擇Help->Software Updates->Find and Install
 
2.選擇 Search for new features to install 選擇Next
 
3.選擇 New Remote Site
 
4.輸入更新地址:http://eclipse-cs.sourceforge.net/update
 
5. 安裝后重啟即可
 
方法二:
 
1.下載eclipse插件
 
 
下載后,把里面的兩個文件夾plugins和 features下面的文件分別拷貝到eclipse目錄下面對應的plugins和features目錄
 
2.如果你就這樣直接啟動eclipse可能會出現ClassNotFoundExceptions 等錯誤(一般不會出現此類錯誤),所以必須在啟動eclipse的時候加上一個參數 -clean. 這樣eclipse就可以更新它當前安裝的許多插件信息
比如你得eclipse在d盤,那么就是 d:\eclipse\eclipse.exe -clean 
 
二、CheckStyle 使用
 
安裝成功后,選中工程,右鍵選擇checkstyle->check code with checkstyle,檢查錯誤即可
 
 
三、Checkstyle的結果輸出
 
檢查后會發現代碼中出現很多放大鏡圖標,如下圖所示,這就是Checkstyle的輸出,具體含義如下:
 
 

1 Type is missing a javadoc commentClass 
缺少類型說明

2 “{” should be on the previous line   
“{” 應該位於前一行。解決方法:把“{”放到上一行去

3 Methos is missing a javadoc comment
方法前面缺少javadoc注釋。解決方法:添加javadoc注釋,類似這樣:

/**

* set default mock parameter.(方法說明)

* @param additionalParameters parameter additional(參數名稱)

* @return data manager(返回值說明)

* @throws Exception if has error(異常說明)

*/

4 Expected @throws tag for “Exception”
在注釋中希望有@throws的說明
解決方法:在方法前得注釋中添加這樣一行:* @throws Exception if has error(異常說明)

5 “.” Is preceeded with whitespace “.”
前面不能有空格。解決方法:把“.”前面的空格去掉

6 “.” Is followed by whitespace“.”
后面不能有空格。解決方法:把“.”后面的空格去掉

7 “=” is not preceeded with whitespace
“=” 前面缺少空格。解決方法:在“=”前面加個空格

8“=” is not followed with whitespace“=”
后面缺少空格。解決方法:在“=”后面加個空格

9“}” should be on the same line“}”
應該與下條語句位於同一行。解決方法:把“}”放到下一行的前面

10 Unused @param tag for “unused”
沒有參數“unused”,不需注釋
解決方法:“* @param unused parameter additional(參數名稱)” 把這行unused參數的注釋去掉“

11 Variable “CA” missing javadoc
變量“CA”缺少javadoc注釋
解決方法:在“CA“變量前添加javadoc注釋:/** CA. */(注意:一定記得加上“.”)

12 Line longer than 80characters
行長度超過80  。解決方法:把它分成多行寫。必要時候,可以ctrl+shift+f

13 Line contains a tab character
行含有”tab” 字符。

14 Redundant “Public” modifier
冗余的“public” 修飾符 。解決方法:去掉“public”修飾符

15 Final modifier out of order with the JSL suggestion
Final modifier的順序錯誤

16 Avoid using the “.*” form of import
import格式避免使用“.*”。解決方法:可以先不添加import,再需要用到時直接“ctrl + o”導入即可。

17 Redundant import from the same package
從同一個包中Import內容,多余,刪掉即可

18 Unused import-java.util.list
Import進來的java.util.list沒有被使用。解決方法:去掉導入的多余的類

19 Duplicate import to line 13
重復Import同一個內容。解決方法:去掉導入的多余的類

20 Import from illegal package
從非法包中 Import內容

21 “while” construct must use “{}” 
“while” 語句缺少“{}”

22 Variable “sTest1” must be private and have accessor method
變量“sTest1”應該是private的,並且有調用它的方法

23 Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$”
變量“ABC”不符合命名規則“^[a-z][a-zA-Z0-9]*$”,解決方法:把這個命名改成符合規則的命名 “aBC”

24 “(” is followed by whitespace
“(” 后面不能有空格 25“)”is proceeded by whitespace“)” 前面不能有空格。解決方法:把前面或者后面的空格去掉

25 First sentence should end with a period
解決方法:你的注釋的第一行文字結束應該加上一個"."。

26 Redundant throws: 'NameNotFoundException' is subclass of 'NamingException'.
'NameNotFoundException '是'NamingException'的子類重復拋出異常。
解決方法:如果拋出兩個異常,一個異常類是另一個的子類,那么只需要寫父類
去掉NameNotFoundException異常,對應的javadoc注釋異常注釋說明也需要去掉

27 Parameter docType should be final.
參數docType應該為final類型, 解決方法:在參數docType前面加個final

28 Line has trailing spaces.
多余的空行 ,解決方法:去掉這行空行

29 Must have at least one statement. 
至少一個聲明

解決方法:} catch (NumberFormatException nfe) {

LOG.error("Auto Renews the agreement failed", nfe);//異常捕捉里面不能為空,在異常里面加一句話。如打印等等

30 '>' is not followed by whitespace.並且又有 '(' is preceded with whitespace.
定義集合和枚舉的時候的時候,最后一個“>”后面要有空格,“(”前面不容許有空格。解決方法:去掉泛型

31 Got an exception - java.lang.RuntimeException: Unable to get class information for @throws tag 'SystemException'.
原因:不合理的throws。

解決方法:要確保某些類型,如某些類、接口不被throws。把聲明的異常去掉。在實現類中拋出異常

網上參考解決方法:

1、這是CheckStyle報的錯。通常需要Refreh, clean/build這個Project. 如果不行,可以嘗試clean all projects, restart Eclipse.

2、因為編譯好的類沒有在checkstyle的classpath中.所以, 只要將編譯好的class配置到在<checkstyle/>的classpath中就沒有這個問題了.另外, 還發現checkstyle的line length好像也有點問題, 明明沒有超過120個字符, 卻還是報錯.無奈, 我把Eclipse中java > code style > formatter中的Maximum line with改成了100, 然后format一下, 基本就沒有問題了

32 File does not end with a newline.
解決方法:刪掉報錯的類,新建一個同名的類,把代碼全部復制過去

33 Utility classes should not have a public or default constructor.
接口中的內部類中不應該有公共的或者默認的構造方法

解決方法:在內部類中,定義一個私有的構造方法,然后內部類聲明為final類型。如果前面有static,那么final還必須放在static之后

34 Variable 'functionCode' must be private and have accessor methods.
變量要改成private然后提供訪問的方法

解決方法:給這些變量的修飾符改成private,然后提供set,get方法,並加上對應的方法javadoc注釋、參數注釋。並在返回值和參數類型前添加final。並把調用了這個變量的地方改成通過方法訪問

35   'X' hides a field.

public class Foo
{
    private int bar;

    public Foo(int bar)
    {
        this.bar = bar;
    }

    public final int getBar()
    {
        return bar;
    }
}

全局private int bar;和局部public Foo(int bar)的bar變量名字重復。
解決方法:把方法里面的參數名稱改變下就可以了public Foo(int newBar)
    {
        this.bar = newBar;
    }。

36 Got an exception - Unexpected character 0xfffd in identifier

這是因為CheckStyle不能識別制定的編碼格式。

網上參考解決方法:

1、Eclipse中可以配置,在Other-->checker中可以指定

2、可以修改checkstyle配置文件:

<module name="Checker">

<property name="severity" value="warning"/>

<property name="charset" value="UTF-8"/>

<module name="TreeWalker">

如果是UTF-8的話,就添加加粗斜體的那條語句,就可以了。

37  Got an exception - java.lang.RuntimeException: Unable to get class information for @throws tag *whatever*.
網上參考解決方法:選中CheckSytle的JavaDoc --> Method JavaDoc --> logLoadErrors。如果是CheckStyle自己加載時出錯的,打個Log就可以了,不要整出Errors嚇人。
還有一處也可能包出同樣的錯誤。Coding Problems --> Redundant Throws --> logLoadErrors選中即可

38 Expected @param tag for 'dataManager'.
缺少dataManager參數的注釋   解決方法:在注釋中添加@param dataManager DataManager

39 Parameter X should be final.
public class Foo
{
    private int bar;

    public Foo(int bar)
    {
        this.bar = bar;
    }

    public final int getBar()
    {
        return bar;
    }
}

解釋:public Foo(int bar)的局部變量,被認為是不可改變的,檢查需要加上final關鍵字定義public Foo(final int bar)此錯誤,可以忽略不檢查。

40 Redundant 'X' modifier.

public interface CacheHRTreeService extends Manager {

/**
  * Organization Tree
  * @param orgDto
  * @return
  * @throws Exception
  */
public void setOrganization(OrganizationDTO orgDto) throws Exception;

/**
  * Organization Tree
  * @return
  * @throws Exception
  */
public OrganizationDTO getOrganization() throws Exception;
......
}

解釋:多余的字段。public OrganizationDTO getOrganization() throws Exception;此時public為多余的字段,因為interface定義的時候,就是public的。

需要檢查。

41 Class X should be declared as final.

解釋:對於單例設計模式,要求返回唯一的類對象。但是HRFactory和ContextFactory為優化的兩個類,不需求檢查。
其他的單例類,依然需要進行檢查。

42 Method 'addChildrenId' is not designed for extension - needs to be abstract, final or empty.

解釋:通過父類繼承的,此類有點特殊可以忽略此類。

43 Variable 'id' must be private and have accessor methods.

解釋:BaseHRDTO類,為父類,屬性給子類繼承,比較特殊。但是其他的類,聲名需要加上范圍'private'關鍵字。需要檢查。

44 Array brackets at illegal position.

解釋:代碼寫法,習慣不一樣。需要檢查,僅僅提示

 

結果輸出解釋參考:http://www.cnblogs.com/bluesky4485/archive/2011/11/30/2269198.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM