Checkstyle 报告 LocalFinalVariableNameCheck 错误 catch 异常参数



我有一个奇怪的问题,我不确定这是两只耳朵之间的问题还是检查样式问题。运行 checkstyle 6.2,我们在 Jenkins 中得到了这两个错误,并且使此错误黯然失色:

LocalFinalVariableNameCheck, Priority: Normal 
Name 'pEx' must match pattern '^l[A-Z][a-zA-Z0-9]*$'.

这是代码

...
} catch (final XPathExpressionException pEx) {
   throw new ConfigurationException(pEx);
}

为什么 checkstyle 将 catch 块定义为本地变量而不是参数?

正如@Dongqing所指出的,pEx确实是一个局部变量,因此检查适用于此处。

但需要注意的是:此规则的默认值是 checkstyle 文档(该工具的最新版本)中指定的^[a-z][a-zA-Z0-9]*$。您可能已经定制的模式以适应一些当地标准^l[A-Z][a-zA-Z0-9]*$。因此,在删除违规之前,您可能应该确保命名模式确实没问题(如果它不适合,为什么要定义自定义规则?

如果您真的想摆脱此违规,Checkstyle 提供了多种方法来抑制警告。您可以:

  • 使用抑制 XML 文件,该文件允许您针对给定的行范围(甚至列范围)禁止特定文件上的特定规则。这样,您就不必修改代码,但需要维护一个包含所有抑制的单独文件。
  • 使用注释或
  • 注释通过添加注释或注释来禁用警告(例如 @SuppressWarnings ) 就在代码中,误报在哪里。这也必须配置。有关更多详细信息和示例,请参阅上面的链接。

编辑:此检查样式规则还允许您调整变量声明捕获子句的模式。以下配置应该适合您:

<module name="LocalVariableName">
    <property name="format" value="^[a-zA-Z0-9]*$"/>
    <property name="tokens" value="PARAMETER_DEF"/>
</module>

在这里,您仅为 catch 子句中的冲突指定非常宽容的模式。变量声明不应受到影响,仍应检查原始模式。

try {}

catch (){} 是一个语句而不是一个方法调用。 所以pEx是一个局部变量而不是一个参数

在鲍里斯的帮助下,我找到了解决方案。这是一个与检查样式 5.7 合并的更改,就像它看起来一样

    <module name="LocalFinalVariableName">
        <!-- checkstyle changed to pass exception checks to local vars?!? in version 5.7 -->
        <!-- catch blocks have params => use a different local var -->
        <property name="format" value="^p[a-zA-Z0-9]*$" />
        <property name="tokens" value="PARAMETER_DEF" />
    </module>
    <module name="LocalFinalVariableName">
        <property name="format" value="^l[A-Z][a-zA-Z0-9]*$" />
        <property name="tokens" value="VARIABLE_DEF" />
    </module>
    <module name="LocalVariableName">
        <!-- checkstyle changed to pass exception checks to local vars?!? in version 5.7 -->
        <!-- catch blocks have params => use a different local var -->
        <property name="format" value="^p[a-zA-Z0-9]*$" />
        <property name="tokens" value="PARAMETER_DEF" />
    </module>
    <module name="LocalVariableName">
        <property name="format" value="^l[A-Z][a-zA-Z0-9]*$" />
        <property name="tokens" value="VARIABLE_DEF" />
    </module>

最新更新