title: Findbugs、checkStyle、PMD常見錯誤總結
2019-05-12 10:46:01
記錄的是在軟件工程基礎實驗中使用到的代碼審計工具(基於Eclipse)的一些能夠審計到的錯誤類型,大部分來源於網絡,在這裏歸納,方便以後查看。這裏用到的工具主要是checkstyle、findbugs、PMD,同時在實踐中實際使用工具進行代碼評審所發現的問題通過圖片展示出來。
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+shif+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 “1[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。把聲明的異常去掉。在實現類中拋出異常
-
- 這是CheckStyle報的錯。通常需要Refreh, clean/build這個Project。
如果不行,可以嘗試clean all projects, restart Eclipse.
- 這是CheckStyle報的錯。通常需要Refreh, clean/build這個Project。
-
- 因爲編譯好的類沒有在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變量名字重複。
解決方法:把方法裏面的參數名稱改變下就可以了。
36 Got an exception - Unexpected character 0xfffd in identifier
這是因爲CheckStyle不能識別制定的編碼格式。
網上參考解決方法:
-
- Eclipse中可以配置,在Other–>checker中可以指定
-
- 可以修改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.
解釋:代碼寫法,習慣不一樣。需要檢查,僅僅提示。
Findbugs:
FindBugs找出的bug有3中顏色:
1. 黑色的臭蟲標誌是分類
2. 紅色的臭蟲表示嚴重bug發現後必須修改代碼
3. 橘黃色的臭蟲表示潛在警告性bug 儘量修改
每次使用Find Bugs(文件,文件夾上右鍵--> Find Bugs-->Find Bugs)命令時,如果改動了代碼,需要先Build Project;
修改完相關bug之後,在文件上右鍵-Find Bugs-->Clear Bug Marker清除Find Bugs的標誌
PMD:
1. 潛在的bug:空的try/catch/finally/switch語句
2. 未使用的代碼:未使用的局部變量、參數、私有方法等
3. 可選的代碼:String/StringBuffer的濫用
4. 複雜的表達式:不必須的if語句、可以使用while循環完成的for循環
5. 重複的代碼:拷貝/粘貼代碼意味着拷貝/粘貼bugs
6. 循環體創建新對象:儘量不要再for或while循環體內實例化一個新對象
7. 資源關閉:Connect,Result,Statement等使用之後確保關閉掉
a-z ↩︎