编码规范(二)----JAVA编码规范插件_阿里 java编码规范及插件有哪些-程序员宅基地

技术标签: P3C  编码规范  编码规范插件  编码  CheckStyle  

一、前言


在项目开发的过程中,很多时候,无法统一大家的编码规范,你有你的风格,我有我的风格,虽然每个公司都有自己的规范,但是有时候,作为开发人员的我们,写者写着,就按自己的来了,反正有没有人来检查,或者是人为的检查感觉费时间,这时候,就可以通过一些代码插件工具来提高我们的效率,目前常见的有:CheckStyle阿里巴巴的p3c插件等。


CheckStyle简介


CheckStyle是一个帮助程序员来遵守一直的编码规范的工具。默认,它支持google 和sun 的java style guide。而且它是高度可配置的,允许自定义编码规范,并可以对各种IDE(eclipse、Intellij)和构建工具(maven,gradle)的支持。


P3C简介


该插件主要是对今年发布的《阿里巴巴 Java 开发规约》的一个延伸,它以一个 IDE 的插件存在,可以自动对手册中的 Java 不规范的问题进行提示。现在主要支持(IDEA、Eclipse),Android Studio 是基于 IDEA 的,所以也是支持 Android 开发人员的。该插件在扫描代码后,会将不符合规约的代码按照 Blocker/Critical/Major 三个等级显示在下方,甚至在 IDEA 上,还可以基于 Inspection 机制提供了实时检测的功能,编写代码的同时也能快速发现不规范的代码。而对于历史代码,部分规则实现了批量一键修复的功能,为首次在成熟项目上,使用插件,做了非常友善的支持。


注意:

这里我们主要讲工具的使用,并没有讲代码编写的一些规范,目前讲的很详细的有《阿里巴巴Java开发手册》可以参考他的语法。

 

二、安装


这里分别以IDEA和Eclipse来演示安装:


2.1、Eclipse安装CheckStyle、P3C


2.1.1、安装CheckStyle


Eclipse中,选择Help->Eclipse Marketplace



点击Install




点击Confirm




安装后重启即可


2.1.2、安装P3C


Eclipse中,选择Help->Software Updates->Find and Install



输入Update Site地址:https://p3c.alibaba.com/plugin/eclipse/update 回车,然后勾选Ali-CodeAnalysis,再一直点Next Next...按提示走下去就好。 然后就是提示重启了,安装完毕。
 


2.2、IDEA安装CheckStyle、P3C


IDEA安装就更简单了,步骤如下:


settings---->plugins




输入你要安装的插件,然后点击安装就行了,安装好之后,也得重启下。


三、使用



(一)、CheckStyle使用


3.1、Checkstyle全局配置


Window -->Preferences,选择checkstyle菜单,增加项目组统一的规则文件,并设置为默认规则。如下图:



Checkstyle默认提供的配置文件有两个:


一是Sun Checks,对应的配置文件是google_checks.xml文件,含义是Checkstyle configuration that checks the sun coding conventions,一般Sun Checks的检查项限定得较为严格,我们实际项目中并不要求那么完美的编程规范,那么可以自己定义检查的配置文件,最后将Checkstyle的配置文件设定为我们自定义的文件即可。


另一个是Google Checks,对应的配置文件是google_checks.xml,一般Checkstyle默认的设置就是sun_checks.xml配置文件。


点击“New”按钮后,弹出“Check Configuration Properties”窗口,如下图所示:



在上图中选择“Type”为“External Configuration File”(外部配置文件),在“Location”行点击“Browse”按钮浏览选择checkstyle的配置文件,例如eclipse_checkstyle.xml文件(仅供参考,可自行定义),并输入“Name”行的值,例如“eclipse_checkstyle”,点击“OK”按钮完成导入操作。回到Checkstyle主页面选择刚才添加的文件,点击“Set As Default”将其设置为默认checkstyle检查文件。




注意: 



文件的格式必须要UTF-8,否则会提示错误:unable to parse configuration stream


3.2、Checkstyle项目配置


项目 --> 右键Properties




配置好之后,点击Apply and Close,此时CheckStyle已经开始运行了。然后你就会发现发现项目上有很多红叉叉,说明是代码不符合规范造成的。




3.3、其他操作


在项目右键菜单中,checkstyle还有一些快捷操作,如下图所示:




还可以可视化进行查看: windows---->show view






3.4、Checkstyle的配置


Checkstyle配置是通过指定modules来应用到java文件的。modules是树状结构,以一个名为Checker的module作为root节点,一般的checker都会包括TreeWalker子module。我们可以参照checkstyle中的sun_checks.xml,这是根据sun的java语言规范写的配置。


在xml配置文件中通过module的name属性来区分module,module的Properties可以控制如何去执行这个module,每个property都有一个默认值,所有的check都有一个severity属性,用它来指定check的level。TreeWalker为每个java文件创建一个语法树,在节点之间调用submodules的Checks。


下面来看看standard checks中的一些具体用法。


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


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

检查类名和接口名。


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文件来指定。


Size Violations


l         ExecutableStatementCount

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

l         FileLength

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

l         LineLength

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

l         MethodLength

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

l         AnonInnerLength

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

l         ParameterNumber

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


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

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


ModifierOrder


l         ModifierOrder

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

l         RedundantModifier

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


Block Checks


l         EmptyBlock

检查空的代码块。

l         LeftCurly

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

l         NeedBraces

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

l         RightCurly

检查’}’

l         AvoidNestedBlocks

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


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

限制抛出异常的数量。


Duplicate Code


l         StrictDuplicateCode

严格检查重复代码。


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

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


详细请参考: http://blog.csdn.net/weidawei0609/article/details/7302911


3.5、自定义CheckStyle规范


Checkstyle没有图形化的定制器,所以需要手工修改配置文件。比如,我们的代码需要符合下列规则: 


* 长度方面:文件长度不超过1500行,每行不超过120个字,方法不超过60行. 
* 命名方面:类名不能小写开头,方法名不能大写开头,常量不能有小写字母。 
* 编码方面:不能用魔法数(Magic Number),if最多嵌套3层。 


那么,我们的检查配置文件(如命名成 eclipse_checkstyle.xml )应该是这样的: 


下面是对具体的check的描述。这些check可以被分为了15类,如下所示:


===== CHECK STYLE ========
----- Annotations -------- JDK5中的Annotation相关(未展开)
----- Block Checks ------- 代码块相关
----- Class Design ------- 类设计相关
----- Coding ------------- 编码相关
----- Duplicate Code ----- 冗余代码
----- Headers ------------ 源文件的头
----- Imports ------------ 引入包相关
----- Javadoc Comments --- JavaDoc相关
----- Metrics ------------ 复杂度分析
----- Miscellaneous ------ 其它
----- Modifiers ---------- 修饰符相关
----- Naming Conventions - 命名规范
----- Regexp ------------- 正则表达式相关
----- Size Violations ---- 文件大小等相关
----- Whitespace --------- 空格处理相关
==========================



详细的可以参考这:http://blog.csdn.net/yang1982_0907/article/details/18086693


一个示例:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">
    <!--
        If you set the basedir property below, then all reported file
        names will be relative to the specified directory. See
        http://checkstyle.sourceforge.net/5.x/config.html#Checker

        <property name="basedir" value="${basedir}"/>
    -->

    <!-- 检查每个包中是否有java注释文件,默认有package-info.java -->
    <!-- <module name="JavadocPackage"/> -->

    <!-- 检查文件是否以一个空行结束 -->
    <!--<module name="NewlineAtEndOfFile">-->
        <!--<property name="lineSeparator" value="lf"/>-->
        <!--<property name="fileExtensions" value="java, xml, py"/>-->
    <!--</module>-->

    <!-- 检查property文件中是否有相同的key -->
    <module name="Translation"/>

    <!-- 文件长度不超过1500行 -->
    <module name="FileLength">
        <property name="max" value="1500"/>
    </module>

    <!-- 检查文件中是否含有'\t' -->
    <module name="FileTabCharacter"/>

    <!-- 检查文件中的空行. -->
    <module name="RegexpSingleline">
        <property name="format" value="\s+$"/>
        <property name="minimum" value="0"/>
        <property name="maximum" value="0"/>
        <property name="message" value="Line has trailing spaces."/>
    </module>


    <!-- 每个java文件一个语法树 -->
    <module name="TreeWalker">
        <!-- 注释检查 -->
        <!-- 检查方法和构造函数的javadoc -->
        <module name="JavadocMethod">
            <!--<property name="severity" value="warning"/>-->
            <property name="tokens" value="METHOD_DEF"/>
        </module>
        <!-- 检查类和接口的javadoc。默认不检查author和version tags -->
        <module name="JavadocType"/>
        <!-- 检查变量的javadoc -->
        <module name="JavadocVariable"/>
        <!-- 检查javadoc的格式 -->
        <module name="JavadocStyle">
            <property name="checkFirstSentence" value="false"/>
        </module>
        <!-- 检查TODO:注释 -->
        <module name="TodoComment"/>

        <!-- 命名检查 -->
        <!-- 局部的final变量,包括catch中的参数的检查 -->
        <module name="LocalFinalVariableName"/>
        <!-- 局部的非final型的变量,包括catch中的参数的检查 -->
        <module name="LocalVariableName"/>
        <!-- 包名的检查(只允许小写字母),默认^[a-z]+(\.[a-zA-Z_][a-zA-Z_0-9_]*)*$ -->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern" value="包名 ''{0}'' 要符合 ''{1}''格式."/>
        </module>
        <!-- 仅仅是static型的变量(不包括static final型)的检查 -->
        <module name="StaticVariableName"/>
        <!-- Class或Interface名检查,默认^[A-Z][a-zA-Z0-9]*$-->
        <module name="TypeName">
            <property name="severity" value="warning"/>
            <message key="name.invalidPattern" value="名称 ''{0}'' 要符合 ''{1}''格式."/>
        </module>
        <!-- 非static型变量的检查 -->
        <module name="MemberName"/>
        <!-- 方法名的检查 -->
        <module name="MethodName"/>
        <!-- 方法的参数名 -->
        <module name="ParameterName "/>
        <!-- 常量名的检查(只允许大写),默认^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$ -->
        <module name="ConstantName"/>

        <!-- 定义检查 -->
        <!-- 检查数组类型定义的样式 -->
        <module name="ArrayTypeStyle"/>
        <!-- 检查方法名、构造函数、catch块的参数是否是final的 -->
        <!-- <module name="FinalParameters"/> -->
        <!-- 检查long型定义是否有大写的“L” -->
        <module name="UpperEll"/>


        <!-- Checks for Headers                                -->
        <!-- See http://checkstyle.sf.net/config_header.html   -->
        <!-- <module name="Header">                            -->
        <!-- The follow property value demonstrates the ability     -->
        <!-- to have access to ANT properties. In this case it uses -->
        <!-- the ${basedir} property to allow Checkstyle to be run  -->
        <!-- from any directory within a project. See property      -->
        <!-- expansion,                                             -->
        <!-- http://checkstyle.sf.net/config.html#properties        -->
        <!-- <property                                              -->
        <!--     name="headerFile"                                  -->
        <!--     value="${basedir}/java.header"/>                   -->
        <!-- </module> -->

        <!-- Following interprets the header file as regular expressions. -->
        <!-- <module name="RegexpHeader"/>                                -->


        <!-- import检查 避免使用*, Idea修改配置Preference->Editor->Java->Imports Class count to use import with ‘*’ and Names count to use static import with ‘*’ 都改成99 -->
        <module name="AvoidStarImport"/>
        <!-- 检查是否从非法的包中导入了类 -->
        <module name="IllegalImport"/>
        <!-- 检查是否导入了多余的包 -->
        <module name="RedundantImport"/>
        <!-- 没用的import检查,比如:1.没有被用到2.重复的3.import java.lang的4.import 与该类在同一个package的 -->
        <module name="UnusedImports"/>
        <!-- 检查是否导入了指定的非法包。默认情况下,这项检查会拒绝所有的sun.*包,因为直接使用sun.*包的程序肯定不是100%的纯Java程序。-->
        <module name="IllegalImport"/>

        <!-- 长度检查 -->
        <!-- 每行不超过200个字符 -->
        <module name="LineLength">
            <property name="max" value="200"/>
        </module>
        <!-- 方法不超过200行 -->
        <module name="MethodLength">
            <property name="tokens" value="METHOD_DEF"/>
            <property name="max" value="200"/>
        </module>
        <!-- 方法的参数个数不超过20个。 并且不对构造方法进行检查-->
        <module name="ParameterNumber">
            <property name="max" value="20"/>
            <property name="tokens" value="METHOD_DEF"/>
        </module>

        <!-- 空格检查-->
        <!-- 方法名后跟左圆括号"(" -->
        <module name="MethodParamPad"/>
        <!-- 在类型转换时,不允许左圆括号右边有空格,也不允许与右圆括号左边有空格 -->
        <module name="TypecastParenPad"/>
        <!-- Iterator -->
        <!-- <module name="EmptyForIteratorPad"/> -->
        <!-- 检查尖括号 -->
        <!-- <module name="GenericWhitespace"/> -->
        <!-- 检查在某个特定关键字之后应保留空格 -->
        <module name="NoWhitespaceAfter"/>
        <!-- 检查在某个特定关键字之前应保留空格 -->
        <module name="NoWhitespaceBefore"/>
        <!-- 操作符换行策略检查 -->
        <module name="OperatorWrap"/>
        <!-- 圆括号空白 -->
        <module name="ParenPad"/>
        <!-- 检查分隔符是否在空白之后 -->
        <module name="WhitespaceAfter"/>
        <!-- 检查分隔符周围是否有空白 -->
        <module name="WhitespaceAround"/>


        <!-- 修饰符检查 -->
        <!-- 检查修饰符的顺序是否遵照java语言规范,默认public、protected、private、abstract、static、final、transient、volatile、synchronized、native、strictfp -->
        <module name="ModifierOrder"/>
        <!-- 检查接口和annotation中是否有多余修饰符,如接口方法不必使用public -->
        <module name="RedundantModifier"/>


        <!-- 代码块检查 -->
        <!-- 检查是否有嵌套代码块 -->
        <module name="AvoidNestedBlocks"/>
        <!-- 检查是否有空代码块 -->
        <module name="EmptyBlock"/>
        <!-- 检查左大括号位置 -->
        <module name="LeftCurly"/>
        <!-- 检查代码块是否缺失{} -->
        <module name="NeedBraces"/>
        <!-- 检查右大括号位置 -->
        <module name="RightCurly"/>


        <!-- 代码检查 -->
        <!-- 检查是否在同一行初始化 -->
        <!-- <module name="AvoidInlineConditionals"/> -->
        <!-- 检查空的代码段 -->
        <module name="EmptyStatement"/>
        <!-- 检查在重写了equals方法后是否重写了hashCode方法 -->
        <module name="EqualsHashCode"/>
        <!-- 检查局部变量或参数是否隐藏了类中的变量 -->
        <!--<module name="HiddenField">
            <property name="tokens" value="VARIABLE_DEF"/>
        </module>-->
        <!-- 检查是否使用工厂方法实例化 -->
        <module name="IllegalInstantiation"/>
        <!-- 检查子表达式中是否有赋值操作 -->
        <module name="InnerAssignment"/>
        <!-- 检查是否有"魔术"数字 -->
        <module name="MagicNumber">
            <property name="ignoreNumbers" value="-1, 0, 1, 1024"/>
            <property name="ignoreAnnotation" value="true"/>
        </module>
        <!-- 检查switch语句是否有default -->
        <module name="MissingSwitchDefault"/>
        <!-- 检查是否有过度复杂的布尔表达式 -->
        <module name="SimplifyBooleanExpression"/>
        <!-- 检查是否有过于复杂的布尔返回代码段 -->
        <module name="SimplifyBooleanReturn"/>

        <!-- 类设计检查 -->
        <!-- 检查类是否为扩展设计l -->
        <!-- <module name="DesignForExtension"/> -->
        <!-- 检查只有private构造函数的类是否声明为final -->
        <module name="FinalClass"/>
        <!-- 检查工具类是否有public的构造器 -->
        <module name="HideUtilityClassConstructor"/>
        <!-- 检查接口是否仅定义类型 -->
        <module name="InterfaceIsType"/>
        <!-- 检查类成员的可见度 -->
        <module name="VisibilityModifier"/>

        <!-- 代码质量 -->
        <!-- 圈复杂度 不能大于5
        <module name="CyclomaticComplexity">
            <property name="max" value="5"/>
        </module>-->
    </module>

    <!-- 其他检查 -->
    <!-- 文件中使用了System.out.print等-->
    <module name="RegexpSingleline">
        <property name="format" value="System\.out\.print"/>
    </module>
    <!-- 文件中使用了System.exit等-->
    <module name="RegexpSingleline">
        <property name="format" value="System\.exit"/>
    </module>
    <!-- 文件中使用了e.printStackTrace等-->
    <module name="RegexpSingleline">
        <property name="format" value="printStackTrace"/>
    </module>
</module>

符合阿里巴巴代码规范的checkstyle检测文件

基于华为java编程规范的checkstyle.xml以及格式化模版,注释模版


3.6、常见的一些错误提示:

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


(二)、P3C使用


项目右键、然后使用阿里巴巴扫描,结果如下




将不符合规约的代码按Blocker/Critical/Major三个等级显示在下方,规范里的详细信息可以在: windows---->Preferences---->Alibaba Code Analysis中进行查看:


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011781521/article/details/78832195

智能推荐

从零开始搭建Hadoop_创建一个hadoop项目-程序员宅基地

文章浏览阅读331次。第一部分:准备工作1 安装虚拟机2 安装centos73 安装JDK以上三步是准备工作,至此已经完成一台已安装JDK的主机第二部分:准备3台虚拟机以下所有工作最好都在root权限下操作1 克隆上面已经有一台虚拟机了,现在对master进行克隆,克隆出另外2台子机;1.1 进行克隆21.2 下一步1.3 下一步1.4 下一步1.5 根据子机需要,命名和安装路径1.6 ..._创建一个hadoop项目

心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析_heartbleed代码分析-程序员宅基地

文章浏览阅读1.7k次。心脏滴血漏洞HeartBleed CVE-2014-0160 是由heartbeat功能引入的,本文从深入码层面的分析该漏洞产生的原因_heartbleed代码分析

java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)-程序员宅基地

文章浏览阅读1.4k次。前言ofd是国家文档标准,其对标的文档格式是pdf。ofd文档是容器格式文件,ofd其实就是压缩包。将ofd文件后缀改为.zip,解压后可看到文件包含的内容。ofd文件分析工具下载:点我下载。ofd文件解压后,可以看到如下内容: 对于xml文件,可以用文本工具查看。但是对于印章文件(Seal.esl)、签名文件(SignedValue.dat)就无法查看其内容了。本人开发一款ofd内容查看器,..._signedvalue.dat

基于FPGA的数据采集系统(一)_基于fpga的信息采集-程序员宅基地

文章浏览阅读1.8w次,点赞29次,收藏313次。整体系统设计本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下:图1:FPGA数据采集系统框图从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D.._基于fpga的信息采集

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL-程序员宅基地

文章浏览阅读2.5w次。1.背景错误信息:-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud..._com.netflix.zuul.exception.zuulexception

邻接矩阵-建立图-程序员宅基地

文章浏览阅读358次。1.介绍图的相关概念  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:  G=(V,E)其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合1.1 无向图:图中任意两个顶点构成的边是没有方向的1.2 有向图:图中..._给定一个邻接矩阵未必能够造出一个图

随便推点

MDT2012部署系列之11 WDS安装与配置-程序员宅基地

文章浏览阅读321次。(十二)、WDS服务器安装通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下。WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单、安全的通过网络快速、远程将Window..._doc server2012上通过wds+mdt无人值守部署win11系统.doc

python--xlrd/xlwt/xlutils_xlutils模块可以读xlsx吗-程序员宅基地

文章浏览阅读219次。python–xlrd/xlwt/xlutilsxlrd只能读取,不能改,支持 xlsx和xls 格式xlwt只能改,不能读xlwt只能保存为.xls格式xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改xlrd打开文件import xlrdexcel=xlrd.open_workbook('E:/test.xlsx') 返回值为xlrd.book.Book对象,不能修改获取sheett_xlutils模块可以读xlsx吗

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题_unresolved attribute reference 'find_element_by_id-程序员宅基地

文章浏览阅读8.2w次,点赞267次,收藏656次。运行Selenium出现'WebDriver' object has no attribute 'find_element_by_id'或AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'等定位元素代码错误,是因为selenium更新到了新的版本,以前的一些语法经过改动。..............._unresolved attribute reference 'find_element_by_id' for class 'webdriver

DOM对象转换成jQuery对象转换与子页面获取父页面DOM对象-程序员宅基地

文章浏览阅读198次。一:模态窗口//父页面JSwindow.showModalDialog(ifrmehref, window, 'dialogWidth:550px;dialogHeight:150px;help:no;resizable:no;status:no');//子页面获取父页面DOM对象//window.showModalDialog的DOM对象var v=parentWin..._jquery获取父window下的dom对象

什么是算法?-程序员宅基地

文章浏览阅读1.7w次,点赞15次,收藏129次。算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵 魂。二、算法的特征1.可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性) 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。 _算法

【网络安全】网络安全的标准和规范_网络安全标准规范-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏26次。网络安全的标准和规范是网络安全领域的重要组成部分。它们为网络安全提供了技术依据,规定了网络安全的技术要求和操作方式,帮助我们构建安全的网络环境。下面,我们将详细介绍一些主要的网络安全标准和规范,以及它们在实际操作中的应用。_网络安全标准规范

推荐文章

热门文章

相关标签