【问题标题】:Ignoring of Checkstyle warnings with annotation @SuppressWarnings使用注释 @SuppressWarnings 忽略 Checkstyle 警告
【发布时间】:2015-02-25 14:43:00
【问题描述】:

我尝试通过带有注释@SuppressWarnings 的checkstyle 忽略或禁用Eclipse 中的一些无用警告,例如 How to disable a particular checkstyle rule for a particular line of code?

但这对我不起作用。

这里是 checkstyle.xml

<module name="Checker">
  <property name="severity" value="warning"/>
  <module name="SuppressWarningsFilter"/>
  <module name="TreeWalker">
    <property name="tabWidth" value="4"/>
    <module name="FileContentsHolder"/>
    <module name="SuppressWarningsHolder"/>
    <module name="CyclomaticComplexity"/>
    ...

这里是java代码:

@SuppressWarnings("checkstyle:CyclomaticComplexity")
public void doSomeThing() {
 ...
}

同样将warning的值设置为“all”@SuppressWarnings("all")@SuppressWarnings("CyclomaticComplexity")@SuppressWarnings("cyclomaticcomplexity")没有任何结果。

checkstyle 的文档很差。有什么想法吗?

【问题讨论】:

  • 您使用的是 Checkstyle 5.7 或更高版本吗?从 5.7 开始支持 @SuppressWarnings。
  • Checkstyle 6.0 也有这个问题

标签: java eclipse checkstyle


【解决方案1】:

A.抑制警告过滤器

使用 checkstyle 6.5.0 我可以使用@SuppressWarnings。请考虑以下几点:

  • 必须在 Checkstyle 设置中启用 SuppressWarnings 过滤器(请参阅下面示例设置中的“TreeWalker”)。
  • SuppressWarnings 注释的标签中,您必须使用全部小写的 checkstyle 模块的名称。
  • 可选标签中可以使用前缀“checkstyle:”。
  • 如果注释未按预期工作,请尝试更改其位置MagicNumber 模块的注解需要放在方法之前。一些注释必须直接位于显示问题的位置,而其他注释必须位于类定义的前面。

checkstyle 模块MagicNumber 的一些示例:

作品:

@SuppressWarnings("checkstyle:magicnumber")
public example(){
    int g = 5;
}

.

@SuppressWarnings("magicnumber")
public example(){
    int g = 5;
}

不起作用:

@SuppressWarnings("MagicNumber")
public example(){
    int g = 5;
}

.

@SuppressWarnings("magicNumber")
public example(){        
    int g = 5;
}

.

public example(){
    @SuppressWarnings("magicnumber")
    int g = 5;
}

补充说明

  • 我收到一个警告unsupported suppresswarnings,我在 Eclipse 首选项中使用 Java=&gt;Compiler=&gt;Errors/Warnings=&gt;Annotations=&gt;Unhandled token in @SuppressWarnings: Ignore 禁用了该警告

  • 相应 checkstyle 模块的名称(在 xml 文件中定义)未显示在违规消息中,当鼠标悬停在代码问题上时会弹出。我启用了选项“include module id(如果可用)在违规消息中”并手动将所有模块 id 更改为与 xml 文件中的相应模块名称相同,但小写。例如,有一个模块 在 Eclipse checkstyle 设置中显示为“匿名内部类长度”。该模块没有模块ID。我将模块 id 更改为 checkstyle:anoninnerlength,以便我的同事更容易抑制警告:



  • 我在模块 ID 和 SuppressWarnings 标记中使用前缀“checkstyle:”来明确警告不是“标准 Eclipse 警告”。 (可选前缀“checkstyle:”已经可以在标签中使用,而无需更改模块 ID。但是,该前缀不会显示在违规消息中。在模块 ID 中包含它会使消息更加透明,并激励我的同事在标签中也包含前缀。)

B.抑制评论过滤器

  • checkstyle 过滤器Filters=&gt;Suppression Comment Filter 使用在 xml 文件中指定的模块名称。
  • 如果使用前缀“checkstyle:”,模块名也可以使用小写。

作品:

//CHECKSTYLE:OFF: checkstyle:magicnumber        
public example(){
    int g = 5;
}   
//CHECKSTYLE:ON: checkstyle:magicnumber

.

//CHECKSTYLE:OFF: MagicNumber           
public example(){
    int g = 5;
}   
//CHECKSTYLE:ON: MagicNumber

不起作用:

//CHECKSTYLE:OFF: magicnumber           
public example(){
    int g = 5;
}   
//CHECKSTYLE:ON: magicnumber

C.示例 checkstyle settings.xml 文件:

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


<!--
    Checkstyle-Configuration with module ids that can be used as    
    tags in @SuppressWarnings
-->

<module name="Checker">

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

  <module name="SuppressWarningsFilter"/>
  
  <module name="TreeWalker">
    <property name="tabWidth" value="4"/>
    <module name="FileContentsHolder"/>
    <module name="SuppressWarningsHolder"/>

    <module name="SuppressWarnings">
      <property name="id" value="checkstyle:suppresswarnings"/>
    </module> 

    <module name="SuppressWithNearbyCommentFilter"/>

     
  
    <module name="SuppressionCommentFilter">
      <metadata name="net.sf.eclipsecs.core.comment" value="Single warning"/>
      <property name="offCommentFormat" value="CHECKSTYLE\:OFF\: ([\w\|]+)"/>
      <property name="onCommentFormat" value="CHECKSTYLE\:ON\: ([\w\|]+)"/>
      <property name="checkFormat" value="$1"/>
    </module>
    
    <module name="JavadocMethod">
      <property name="id" value="checkstyle:javadocmethod"/>   
      <property name="severity" value="ignore"/>
      <property name="allowMissingParamTags" value="true"/>
      <property name="allowMissingThrowsTags" value="true"/>
      <property name="allowMissingReturnTag" value="true"/>
      <property name="suppressLoadErrors" value="true"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="JavadocType">
      <property name="id" value="checkstyle:javadoctype"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="JavadocVariable">
      <property name="id" value="checkstyle:javadocvariable"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="JavadocStyle">
      <property name="id" value="checkstyle:javadocstyle"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="ConstantName">
      <property name="id" value="checkstyle:constantname"/>
    </module>
    
    <module name="LocalFinalVariableName">
      <property name="id" value="checkstyle:localfinalvariablename"/>
    </module>
    
    <module name="LocalVariableName">
      <property name="id" value="checkstyle:localvariablename"/>
    </module>
    
    <module name="MemberName">
      <property name="id" value="checkstyle:membername"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="MethodName">
      <property name="id" value="checkstyle:methodname"/>
    </module>
    
    <module name="PackageName">
      <property name="id" value="checkstyle:packagename"/>
    </module>
    
    <module name="ParameterName">
      <property name="id" value="checkstyle:parametername"/>
    </module>
    
    <module name="StaticVariableName">
      <property name="id" value="checkstyle:staticvariablename"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="TypeName">
      <property name="id" value="checkstyle:typename"/>
    </module>
    
    <module name="AvoidStarImport">
      <property name="id" value="checkstyle:avoidstarimport"/>
    </module>
    
    <module name="IllegalImport">
      <property name="id" value="checkstyle:illegalimport"/>
    </module>
    
    <module name="RedundantImport">
      <property name="id" value="checkstyle:redundantimport"/>
    </module>
    
    <module name="UnusedImports">
      <property name="id" value="checkstyle:unusedimports"/>
    </module>
    
    <module name="ParameterNumber">
      <property name="id" value="checkstyle:parameternumber"/>
    </module>
    
    <module name="EmptyForIteratorPad">
      <property name="id" value="checkstyle:emptyforiteratorpad"/>
    </module>
    
    <module name="MethodParamPad">
      <property name="id" value="checkstyle:methodparampad"/>
    </module>
    
    <module name="NoWhitespaceAfter">
      <property name="id" value="checkstyle:nowhitespaceafter"/>
      <property name="tokens" value="BNOT,DEC,DOT,INC,LNOT,UNARY_MINUS,UNARY_PLUS"/>
    </module>
    
    <module name="NoWhitespaceBefore">
      <property name="id" value="checkstyle:nowhitespacebefore"/>
    </module>
    
    <module name="OperatorWrap">
      <property name="id" value="checkstyle:operatorwrap"/>
      <property name="option" value="eol"/>
    </module>
    
    <module name="ParenPad">
      <property name="id" value="checkstyle:parenpad"/>
    </module>
    
    <module name="TypecastParenPad">
      <property name="id" value="checkstyle:typecastparenpad"/>
    </module>
    
    <module name="WhitespaceAfter">
      <property name="id" value="checkstyle:whitespaceafter"/>
    </module>
    
    <module name="WhitespaceAround">
      <property name="id" value="checkstyle:whitespacearound"/>
    </module>
    
    <module name="ModifierOrder">
      <property name="id" value="checkstyle:modifierorder"/>
    </module>
    
    <module name="RedundantModifier">
      <property name="id" value="checkstyle:redundantmodifier"/>
    </module>
    
    <module name="LeftCurly">
      <property name="id" value="checkstyle:leftcurly"/>
    </module>
    
    <module name="NeedBraces">
      <property name="id" value="checkstyle:needbraces"/>
    </module>
    
    <module name="RightCurly">
      <property name="id" value="checkstyle:rightcurly"/>
    </module>
    
    <module name="AvoidInlineConditionals">
      <property name="id" value="checkstyle:avoidinlineconditionals"/>
    </module>
    
    <module name="EmptyStatement">
      <property name="id" value="checkstyle:emptystatement"/>
    </module>
    
    <module name="HiddenField">
      <property name="id" value="checkstyle:hiddenfield"/>
      <property name="tokens" value="VARIABLE_DEF"/>
    </module>
    
    <module name="IllegalInstantiation">
      <property name="id" value="checkstyle:illegalinstantiation"/>
    </module>
    
    <module name="InnerAssignment">
      <property name="id" value="checkstyle:innerassignment"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="MagicNumber">
      <property name="id" value="checkstyle:magicnumber"/>
    </module>
    
    <module name="MissingSwitchDefault">
      <property name="id" value="checkstyle:missingswitchdefault"/>
    </module>
    
    <module name="RedundantThrows">
      <property name="id" value="checkstyle:redundantthrows"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="SimplifyBooleanExpression">
      <property name="id" value="checkstyle:simplifybooleanexpression"/>
    </module>
    
    <module name="SimplifyBooleanReturn">
      <property name="id" value="checkstyle:simplifybooleanreturn"/>
    </module>
    
    <module name="DesignForExtension">
      <property name="id" value="checkstyle:designforextension"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="FinalClass">
      <property name="id" value="checkstyle:finalclass"/>
    </module>
    
    <module name="HideUtilityClassConstructor">
      <property name="id" value="checkstyle:hideutilityclassconstructor"/>
    </module>
    
    <module name="VisibilityModifier">
      <property name="id" value="checkstyle:visibilitymodifier"/>
    </module>
    
    <module name="ArrayTypeStyle">
      <property name="id" value="checkstyle:arraytypestyle"/>
    </module>
    
    <module name="UpperEll">
      <property name="id" value="checkstyle:upperell"/>
    </module>
    
    <module name="AnnotationUseStyle">
      <property name="id" value="checkstyle:annotationusestyle"/>
    </module>
    
    <module name="MissingDeprecated">
      <property name="id" value="checkstyle:missingdeprecated"/>
    </module>
    
    <module name="MissingOverride">
      <property name="id" value="checkstyle:missingoverride"/>
    </module>
    
    <module name="PackageAnnotation">
      <property name="id" value="checkstyle:packageannotation"/>
    </module>
    
    <module name="AbstractClassName">
      <property name="id" value="checkstyle:abstractclassname"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="AnonInnerLength">
      <property name="id" value="checkstyle:anoninnerlength"/>     
    </module>
    
    <module name="ExecutableStatementCount">
      <property name="id" value="checkstyle:executablestatementcount"/>
      <property name="max" value="20"/>
      <property name="tokens" value="INSTANCE_INIT,STATIC_INIT,METHOD_DEF,CTOR_DEF"/>
    </module>
    
    <module name="LineLength">
      <property name="id" value="checkstyle:linelength"/>
      <property name="max" value="120"/>
      <property name="tabWidth" value="4"/>
    </module>
        
    <module name="MethodLength">
      <property name="id" value="checkstyle:methodlength"/>
      <property name="severity" value="ignore"/>
      <property name="max" value="20"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="OuterTypeNumber">
      <property name="id" value="checkstyle:outertypenumber"/>
    </module>
    
    <module name="RegexpSinglelineJava">
      <property name="id" value="checkstyle:regexpsinglelinejava"/>
      <property name="format" value="^.*System.out.println.*$"/>
      <property name="ignoreComments" value="true"/>
    </module>
    
    <module name="AvoidNestedBlocks">
      <property name="id" value="checkstyle:avoidnestedblocks"/>
      <property name="allowInSwitchCase" value="true"/>
    </module>
    
    <module name="CovariantEquals">
      <property name="id" value="checkstyle:covariantequals"/>
    </module>
    
    <module name="DefaultComesLast">
      <property name="id" value="checkstyle:defaultcomeslast"/>
    </module>
    
    <module name="DeclarationOrder">
      <property name="id" value="checkstyle:declarationorder"/>
    </module>
    
    <module name="EqualsHashCode">
      <property name="id" value="checkstyle:equalshashcode"/>
    </module>
    
    <module name="ExplicitInitialization">
      <property name="id" value="checkstyle:explicitinitialization"/>
    </module>
    
    <module name="FallThrough">
      <property name="id" value="checkstyle:fallthrough"/>
    </module>
    
    <module name="IllegalCatch">
      <property name="id" value="checkstyle:illegalcatch"/>
    </module>
    
    <module name="IllegalThrows">
      <property name="id" value="checkstyle:illegalthrows"/>
    </module>
    
    <module name="MissingCtor">
      <property name="id" value="checkstyle:missingctor"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="ModifiedControlVariable">
      <property name="id" value="checkstyle:modifiedcontrolvariable"/>
    </module>
    
    <module name="MultipleStringLiterals">
      <property name="id" value="checkstyle:multiplestringliterals"/>
       <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="MultipleVariableDeclarations">
      <property name="id" value="checkstyle:multiplevariabledeclarations"/>
    </module>
    
    <module name="NestedForDepth">
      <property name="id" value="checkstyle:nestedfordepth"/>
      <property name="max" value="2"/>
    </module>
    
    <module name="NestedIfDepth">
      <property name="id" value="checkstyle:nestedifdepth"/>
      <property name="max" value="2"/>
    </module>
    
    <module name="NestedTryDepth">
      <property name="id" value="checkstyle:nestedtrydepth"/>
    </module>
    
    <module name="NoClone">
      <property name="id" value="checkstyle:noclone"/>
    </module>
    
    <module name="NoFinalizer">
      <property name="id" value="checkstyle:nofinalizer"/>
    </module>
    
    <module name="ParameterAssignment">
      <property name="id" value="checkstyle:parameterassignment"/>
    </module>
    
    <module name="StringLiteralEquality">
      <property name="id" value="checkstyle:stringliteralequality"/>
    </module>
    
    <module name="OneStatementPerLine">
      <property name="id" value="checkstyle:onestatementperline"/>
    </module>
    
    <module name="InnerTypeLast">
      <property name="id" value="checkstyle:innertypelast"/>
    </module>
    
    <module name="InterfaceIsType">
      <property name="id" value="checkstyle:interfaceistype"/>
    </module>
    
    <module name="MutableException">
      <property name="id" value="checkstyle:mutableexception"/>
    </module>
    
    <module name="BooleanExpressionComplexity">
      <property name="id" value="checkstyle:booleanexpressioncomplexity"/>
    </module>
    
    <module name="ClassFanOutComplexity">
      <property name="id" value="checkstyle:classfanoutcomplexity"/>
      <property name="max" value="10"/>
    </module>
    
    <module name="JavaNCSS">
      <property name="id" value="checkstyle:gavancss"/>
      <property name="methodMaximum" value="20"/>
    </module>
    
    <module name="NPathComplexity">
      <property name="id" value="checkstyle:npathcomplexity"/>
      <property name="max" value="1200"/>
    </module>
    
    <module name="TrailingComment">
      <property name="id" value="checkstyle:trailingcomment"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    <module name="UncommentedMain">
      <property name="id" value="checkstyle:uncommentedmain"/>
    </module>
    
    <module name="CyclomaticComplexity">
      <property name="id" value="checkstyle:cyclomaticcomplexity"/>
      <property name="max" value="7"/>
    </module>
    
    <module name="StrictDuplicateCode">
      <property name="id" value="checkstyle:strictduplicatecode"/>
      <property name="severity" value="ignore"/>
      <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
    </module>
    
    
    
  </module>
  
  
  
  <module name="JavadocPackage">
    <property name="id" value="checkstyle:javadocpackage"/>
    <property name="severity" value="ignore"/>
    <metadata name="net.sf.eclipsecs.core.lastEnabledSeverity" value="inherit"/>
  </module>
  
  <module name="Translation">
      <property name="id" value="checkstyle:translation"/>
  </module>
  
  <module name="FileLength">
    <property name="id" value="checkstyle:filelength"/>   
    <property name="max" value="1000"/>
  </module>
  
  <module name="NewlineAtEndOfFile"> 
    <property name="id" value="checkstyle:newlineatendoffile"/>   
    <property name="fileExtensions" value="*.java"/>
  </module>
  
  
  
</module>

【讨论】:

  • 在 Checkstyle 8.1 中验证过,checkstyle 模块的名称不再需要小写。
  • 据我了解,只有在我在 TreeWalker 中添加 后,SuppressWarnings 注释才有效。不确定是否有必要,但我还在 TreeWalker 之外添加了
  • 我可以确认唯一可行的方法是在 TreeWalker 之外使用 &lt;module name="SuppressWarningsFilter"/&gt; - 这是或 checkstyle 8.9
  • 没有对文件进行任何其他更改,唯一对我有用的是关闭和打开//CHECKSTYLE:OFF: StaticVariableName //CHECKSTYLE:ON: StaticVariableName 的评论,所以最终使用了这种方法。
【解决方案2】:

只是为了强调 Caio Faustino 的评论,它至少解决了 checkstyle 8.19 的问题。

  1. &lt;module name="SuppressWarningsHolder"/&gt; 添加到Treewalker 元素。
  2. 添加&lt;module name="SuppressWarningsFilter"/&gt;作为通用模块。
<module name="Checker">
  <--! ... -->
  <module name="TreeWalker">
    <--! ... -->
    <module name="SuppressWarningsHolder"/>
  </module>
  <module name="SuppressWarningsFilter"/>
</module>

【讨论】:

  • #blessYou。我一直在互联网上试图弄清楚为什么我的 8.33 不工作。感谢 2 个神奇的 xml-elmements 的“上下文”。
【解决方案3】:

我的 checkstyle 版本是8.1

它适用于这样的 gradle 配置:

build.gradle:

apply plugin: 'checkstyle'

checkstyle {
    configFile = file('config/checkstyle.xml')
    toolVersion = '8.1'
}

并忽略这样的幻数:

@SuppressWarnings("checkstyle:MagicNumber")
private String f(String a) {
    String b = a.substring(0, 7);
    String c = a.substring(a.length() - 3);
    return b + "-" + c;
}

注意: 前缀 checkstyle: 是可选的。 希望这可以帮助某人。

【讨论】:

  • 您愿意分享您的 checkstyle.xml 文件吗?
  • @JustinTilson 当然。看我的要点gist.github.com/pengisgood/c2432403a03500cf4ec1826b85a08234
  • 我的环境中一定有什么东西是关闭的。我已经逐字复制了您的配置,但我的抑制仍然被忽略。我正在使用 checkstyle 8.1 和 Gradle 4.4.1。在每个错误的开头,我看到: [ant:checkstyle] [ERROR]... 我不确定 ant 是如何参与其中的,或者这是否是一个问题。您的代码是否在任何地方的可公开访问的存储库中?我可以克隆它并尝试运行它吗?
猜你喜欢
  • 2014-11-25
  • 2013-06-20
  • 1970-01-01
  • 2012-03-25
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多