代码规范工具-Checkstyle使用手册

来自 : http://blog.csdn.net/maritimesun/article/details/7668718


 前段时间中心需要对外包的项目进行代码质量管理,所以在此对前段时间的工作做下总结。

      现在很多开源工具都可以对代码进行规范审核,比较流行的有以下几款,大致给个简单介绍。

     PMD:是一款采用BSD协议发布的Java程序代码检查工具,可以做到检查Java代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必要的对象等。
     FindBugs:是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
     Checkstyle:是一个静态分析工具,检查Java程序代码。
     Cppcheck是一种C/C++代码缺陷静态检查工具。
   PC-Lint也是一种静态代码检测工具,检查C或C++。

      目前,中心使用的是Checkstyle工具。我个人觉得PMD和Checkstyle很类似,都可以以插件的形式集成到Eclipse或是MyEclipse开发环境中。下面就Checkstyle在Eclipse中的使用详细介绍下,同时,也欢迎大家继续补充。

1        Checkstyle的下载和安装

1.1  Checkstyle的下载

      Checkstyle可以从其官网http://checkstyle.sourceforge.net/中下载。官网中还提供了Checkstyle的相关文档,如配置文件、代码检查项等,内容比较丰富,覆盖面也较齐全。可依据自身需要,参考官网上的相关资料。进入Checkstyle的官网后,进入Download页面,可以下载Checkstyle。目前,大多数开发项目使用Eclipse或是MyEclipse的集成开发环境,因此我推荐进入http://en.sourceforge.jp/projects/sfnet_eclipse-cs/releases/下载,该网站上有EclipseCheckstyle Plug-in的各种版本。下文的介绍中,我采用的是net.sf.eclipsecs-updatesite_5.5.0.201111092104-bin.zip版本的Checkstyle插件。

1.2  Checkstyle的安装

    以下的安装过程,基于Eclipse SDK-3.7.2。

   (1)打开eclipse,在help中选择install software。

(2)点击add, 选择中Checkstyle安装包net.sf.eclipsecs-updatesite_5.5.0.201111092104-bin.zip;

   

(3)点击OK,进入下一步;

(4)重启Eclipse。

        确认安装成功的步骤:

     打开eclipse,选择window->preferences->左边导航栏中Checkstyle,如果出现checkstyle说明你安装成功。


2  Checkstyle的配置

     Checkstyle默认提供的配置文件有两个:一是Sun Checks,对应的配置文件是sun_checks.xml文件,含义是Checkstyle configuration that checks the sun coding conventions;一般Checkstyle默认的设置就是sun_checks.xml配置文件。另一个是Sun Checks(Eclipse),对应的配置文件是sun_checks_eclipse.xml,含义是Slightly modified version of Sun Checks that better matches the default code formatter setting of Eclipse.

     一般Sun Checks的检查项限定得较为严格,我们实际项目中并不要求那么完美的编程规范,那么可以自己定义检查的配置文件,最后将Checkstyle的配置文件设定为我们自定义的文件即可。关于检查项的设定,我会是下面章节中讲解。先来看看Checkstyle如何快速使用吧。

3  Checkstyle的快速入门使用

   Checkstyle安装好之后,就可以使用它来检查我们的代码啦。

3.1 使用Checkstyle检查单个java文件

   选中文件,右击选择Checkstyle,选择Check Code with Checkstyle。



        此时,看看原文件的变化吧。原文件上会在不符合规范的地方出现黄颜色!号,鼠标停留在叹号处,可以看到信息提示。或者,在Console控制台一栏,可以看到Checkstyle violations 的视图,里面会有信息提示。



     选择Checksty violations chart视图,会把每种不规范的信息做下统计,绘制成图表,够人性化吧,哈哈哈。



3.2 使用Checkstyle检查整个项目

    在项目名上,右击选择Checkstyle,选择Check Code with Checkstyle。


   查看不规范的信息,方法同3.1节一样。


  Checkstyle 也可以检查整个包的文件,或者某一代码段的文件。具体的,大家可以依据需要,我不再一一介绍。

4、Checkstyle的各种检查项

 要想按照自己的需求,定义Checkstyle配置文件,需要先了解Checkstyle配置文件的构成。在《代码规范工具-Checkstyle使用手册》一文中,我提及到两个Checkstyle提供的配置文件sun_checks.xml和sun_checks_eclipse.xml,那么现在下看下这两个文件的构成吧。sun_checks.xml和sun_checks_eclipse.xml所在的路径为:将Checkstyle安装包解压,在解压目录下,进入plugins, plugins目录下面有一个net.sf.eclipsecs.core_5.5.0.201111092104安装包,将该安装包解压,大家就可以看到sun_checks.xml和sun_checks_eclipse.xml这两个配置文件了。打开这两个配置文件后,我们大概可以看到:他们其实结构上几乎是一模一样的,因为sun_checks_eclipse.xml相当于sun_checks.xml的更加严格的规范限定版本,因此,我们只需要看sun_checks.xml文件即可。

1  Checkstyle的检查原理

    sun_checks.xml是由多个module节点构成,因此可以发现:Checkstyle配置是通过指定modules来应用到java文件的。modules是树状结构,以一个名为Checker的module作为root节点,一般的checker都会包括TreeWalker子module。在xml配置文件中通过module的name属性来区分module,module的Properties可以控制如何去执行这个module,每个property都有一个默认值,所有的check都有一个severity属性,用它来指定check的level。

TreeWalker为每个java文件创建一个语法树,在节点之间调用submodules的Checks

2  standard checks中的一些具体用法

2.1  Javadoc Comments

l         JavadocPackage

检查每个java package中是否有java注释文件,默认是允许一个package-info.java,也可以通过allowLegacy属性配置允许package.html

l         JavadocType

检查类和接口的javadoc。默认不检查author version tags

l         JavadocMethod

检查方法和构造函数的javadoc。默认不检查未使用的异常抛出。

l         JavadocVariable

检查变量的javadoc

l         JavadocStyle

检查javadoc的格式。比如:javadoc的第一行是否以句号结束,javadoc除了tags外是否有description,检查javadoc中的html格式。

l         WriteTag

输出javadoc中的tag

2.2  Naming Conventions

l        AbstractClassName

检查抽象类名。

l         ClassTypeParameterName

检查类的Parameter名。

l         ConstantName

检查常量名。

l         LocalFinalVariableName

检查局部的final类型变量名,包括catch的参数。

l         LocalVarableName

检查局部的非final类型的变量名,包括catch的参数。

l         MemberName

检查非静态变量。

l         MethodName

检查方法名。

l         MethodTypeParameterName

检查方法的参数名。

l         PackageName

检查包名。

l         ParameterName

检查参数名。

l         StaticVariableName

检查静态的,非final类型的变量名。

l         TypeName

检查类名和接口名。

2.3  Imports

l         AvoidStarImport

检查是否有使用*进行import

l         AvoidStaticImport

检查是否有静态import。比如是否导入了java.lang包中的内容。

l         IllegalImport

检查是否import了违法的包。默认拒绝import所有sun.*包。

l         RedundanImport

检查是否有重复的import

l         UnusedImports

检查是否有未使用的import

l         ImportOrder

检查import的分组和顺序。

l         ImportControl

控制可import的包。在一个较大的project可限制使用过多的第三方包,通过一个依照http://www.puppycrawl.com/dtds/import_control_1_0.dtd的xml文件来指定。

2.4   Size Violations

l         ExecutableStatementCount

限制可执行代码片段的长度。默认为30

l         FileLength

检查java文件的长度。默认为2000

l         LineLength

检查代码行的长度。默认为80

l         MethodLength

检查方法和构造函数的长度。默认为150

l         AnonInnerLength

检查匿名内部类的长度。默认为20

l         ParameterNumber

检查方法和构造函数的参数个数。默认为7

2.5   Whitespace

l        GenericWhitespace

检查<>周围的空白。

l         EmptyForInitializerPad

检查空的初始化位置的空白。比如for循环中的初始化。

l         EmptyForIteratorPad

检查空的迭代位置的空白。

l         MethodParamPad

检查方法签名之前的空白。

l         NoWhitespaceAfter

检查分隔符后的空白。

l         NoWhitespaceBefore

检查分隔符前的空白。

l         OperatorWrap

检查操作符的空白规则。

l         ParenPad

检查圆括号的空白规则。

l         TypecaseParenPad

检查强制转型的圆括号的空白规则。

l         TabCharacter

检查是否有Tab字符(’"t’)。

l         WhitespaceAfter

检查分隔符是否在空白之后。

l         WhitespaceAround

检查分隔符周围是否有空白。

2.6  ModifierOrder

l         ModifierOrder

检查修饰符的顺序是否遵照java语言规范。

l         RedundantModifier

检查接口和annotation中是否有重复的修饰符。

2.7  Block Checks

l         EmptyBlock

检查空的代码块。

l         LeftCurly

检查’{’和左边的代码块是否在同一行。

l         NeedBraces

检查是否需要大括号。主要是在ifelse时的情况。

l         RightCurly

检查’}’

l         AvoidNestedBlocks

检查不需要的嵌套’{}’

2.8  Coding

l         ArrayTrailingComma

检查数组初始化是否以逗号结束。

l         AvoidInlineConditionals

检查inline的条件操作。

l         CovariantEquals

检查类是否覆盖了equals(java.lang.Object)

l         DoubleCheckedLocking

检查DCL的问题。

l         EmptyStatement

检查空的代码段。

l         EqualsAvoidNull

检查一个可能为null的字符串是否在equals()比较的左边。

l         EqualsHashCode

检查类是否覆盖了equals()和hashCode()

l         FinalLocalVariable

检查未改变过的局部变量是否声明为final

l         HiddenField

检查局部变量或参数是否隐藏了类中的变量。

l         IllegalInstantiation

检查是否使用工厂方法实例化。

l         IllegalToken

检查非法的分隔符。

l         IllegalTokenText

检查非法的分隔符的下个字符。

l         InnerAssignment

检查子表达式中是否有赋值操作。

l         MagicNumber

检查是否有“magic numbers”。

l         MissingSwitchDefault

检查switch语句是否有defaultclause

l         ModifiedControlVariable

检查循环控制的变量是否在代码块中被修改。

l         RedundantThrows

检查是否有被重复抛出的异常。

l         SimplifyBooleanExpression

检查是否有过度复杂的布尔表达式。

l         SimplifyBooleanReturn

检查是否有过于复杂的布尔返回代码段。

l         StringLiteralEquality

检查字符串是否有用= =!=进行操作。

l         NestedIfDepth

检查嵌套的层次深度。

l         NestedTryDepth

检查try的层次深度。

l         NoClone

检查是否覆盖了clone()

l         NoFinalizer

检查是否有定义finalize()

l         SuperClone

检查覆盖的clone()是否有调用super.clone()

l         SuperFinalize

检查覆盖的finalize()是否有调用super.finalize()

l         IllegalCatch

检查是否catch了不能接受的错误。

l         IllegalThrows

检查是否抛出了未声明的异常。

l         PackageDeclaration

检查类中是否有声明package

l         JUnitTestCase

确保setUp(), tearDown()方法签名的正确性。

l         ReturnCount

限制return代码段的数量。

l         IllegalType

检查未使用过的类。

l         DeclarationOrder

检查类和接口中的声明顺序。

l         ParameterAssignment

检查不允许的参数赋值。

l         ExplicitInitialization

检查类和对象成员是否初始化为默认值。

l         DefaultComesLast

检查defaultclause是否在switch代码段的最后。

l         MissingCtor

检查类依赖。

l         FallThrough

检查switch代码的case中是否缺少breakreturnthrowcontinue

l         MultipleStringLiterals

检查一个文件中是否有多次出现的字符串。

l         MultipleVariableDeclarations

检查代码段和代码行中是否有多次变量声明。

l         RequireThis

检查代码中是否有“this.”。

l         UnnecessaryParentheses

检查是否有使用不需要的圆括号。

Class Design

l         VisibilityModifier

检查类成员的可见度。

l         FinalClass

检查只有private构造函数的类是否声明为final

l         InterfaceIsType

检查接口是否仅定义类型。

l         HideUtilityClassConstructor

检查工具类是否有putblic的构造器。

l         DesignForExension

检查类是否为扩展设计。

l         MutableException

确保异常是不可变的。

l         ThrowsCount

限制抛出异常的数量。

2.9  Duplicate Code

l         StrictDuplicateCode

严格检查重复代码。

2.10  Miscellaneous

l         GenericIllegalRegexp

正则表达式的模式检查。

l         NewlineAtEndOfFile

检查文件是否以一个空行结束。

l         TodoComment

检查TODO:注释。

l         Translation

检查property文件中是否有相同的key

l         UncommentedMain

检查是否有未注释的main方法。

l         UpperEll

检查long型约束是否有大写的“L”。

l         ArrayTypeStyle

检查数组类型定义的样式。

l         FinalParameters

检查方法名、构造函数、catch块的参数是否是final的。

l         Indentation

检查代码中正确的缩进。

l         TrailingComment

确保是否要代码行注释。

l         RequiredRegexp

确保一个指定的正则表达式的规则已经存在代码中。

   关于上述这么多检查项,大家可以参考Checkstyle的官网http://checkstyle.sourceforge.net/,官网上对于每一检查项及其配置信息都讲解得很详细。

3  定制自己的配置文件

   在了解了Checkstyle提供的N多检查项以后,我们可以依据sun_checks.xml作为模板来定制复合项目需要的检查项。

   我个人使用Checkstyle默认检查项后的感受是,觉得规范过于严格,一般的项目中很少花较长的时间和较多的精力去完善每一个编程缺陷的。因此,结合项目组的编码规范要求,去定制检查项是比较合理的解决方案。在此,不再一一叙述如何定制,建议大家在依据编码规范定制时,对照官网上的检查项及其配置信息,便能完成此工作。

4  启用定制的配置文件

    以我定制的配置文件checkstyle_test.xml为例。

   进入windows菜单,选择preference, Checkstyle一项,


在Global Check Configurattions中单击New,选中External Configuration File一项,也可以选择Internal 一项吧,貌似Internal 就是属于集成、嵌入到Checkstyle内部的意思吧。


给要导入的配置文件命个名,如Checkstyle_test,单击Import,选择定制好的配置文件导入。

导入好后,我们将该文件设置为默认的检查文件,如下图所示,点击Set as Default:


  至此,我们就可以使用自定制的配置文件检查代码了。

感谢 maritimesun 大神教我做人


来自 : http://blog.csdn.net/simon_world/article/details/40249827

5.常见错误解决方案

1   提示:Type is missing a javadoc commentClass

说明:缺少类型说明

解决方法:增加javadoc说明

2   提示:“{” should be on the previous line

说明:“{”应该位于前一行。

解决方法:把“{”放到上一行去

3   提示:Methos is missing a javadoc comment

说明:方法前面缺少javadoc注释。

解决方法:添加javadoc注释

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 unusedparameter additional(参数名称)” 把这行unused参数的注释去掉“

11 提示: Variable “CA” missingjavadoc

说明:变量“CA”缺少javadoc注释

解决方法:在“CA“变量前添加javadoc注释:/** CA. */(注意:一定记得加上CA后面的“.”)

12 提示: Line longer than 80characters

说明:行长度超过80  。

解决方法:把它分成多行写。必要时候,可以ctrl+shift+f

13 提示:Line contains a tab character

说明:行含有”tab” 字符。

14 提示:Redundant “Public” modifier

说明:冗余的“public” modifier   。

解决方法:冗余的“public”

15 提示:Final modifier out of order with the JSL suggestion 

说明:Final modifier的顺序错误

16 提示: Avoid using the “.*” formof import

说明:Import格式避免使用“.*”

17 提示:Redundant import from the same package

说明:从同一个包中Import内容

18 提示: Unusedimport-java.util.list

说明:Import导入进来的java.util.list没有被使用。

解决方法:去掉导入的多余的类

19 提示:Duplicate import to line 13

说明:重复Import同一个内容   

解决方法:去掉导入的多余的类

20 提示: Import from illegalpackage

说明:从非法包中 Import内容

21 提示:“while” construct must use “{}” 

说明:“while” 语句缺少“{}”

22 提示: Variable “sTest1” must beprivate and have accessor method

说明:变量“sTest1”应该是private的,并且有调用它的方法

23 提示: Variable “ABC” must matchpattern “^[a-z][a-zA-Z0-9]*$

说明:变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]*$”

解决方法:把这个命名改成符合规则的命名 “aBC”

24 提示:“(” is followed by whitespace       “)”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 onestatement. 

说明: 至少有一个声明

解决方法:try{}catch(){}中的异常捕捉里面不能为空,在异常里面加一句话。如打印等

30 提示:'>' is not followed by whitespace.并且又有 '('is preceded with whitespace.

说明:定义集合和枚举的时候的时候,最后一个“>”后面要有空格,“(”前面不容许有空格。

解决方法:去掉泛型(通常是泛型的地方容易出这个问题)

31 提示:Got an exception - java.lang.RuntimeException: Unable to get classinformation 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中的Maximumline with改成了100, 然后format一下, 基本就没有问题了

32 提示: File does not end with anewline.

解决方法:删掉报错的类,新建一个同名的类,把代码全部复制过去

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.

说明:全局private int X;和局部publicFoo(int X)的X变量名字重复。
解决方法:把方法里面的参数名称改变下就可以了public Foo(int newBar)

36 提示: Got an exception -Unexpected character 0xfffd in identifier

说明:这是因为CheckStyle不能识别制定的编码格式。

网上参考解决方法:

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

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

<modulename="Checker">

<propertyname="severity" value="warning"/>

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

<modulename="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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值