【问题标题】:Checkstyle reports LocalFinalVariableNameCheck error on catch-exception parameterCheckstyle 在 catch-exception 参数上报告 LocalFinalVariableNameCheck 错误
【发布时间】:2015-04-03 15:37:27
【问题描述】:

我有一个奇怪的问题,我不确定这是两个耳朵之间的问题还是 checkstyle 问题。 运行 checkstyle 6.2 我们在 jenkins 和 eclipse 中都得到了这个错误:

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 块定义为本地变量而不是参数?

【问题讨论】:

    标签: java checkstyle metrics coding-style


    【解决方案1】:

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

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

    如果您真的想摆脱这种违规行为,Che​​ckstyle 提供了多种方式来抑制警告。你可以:

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

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

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

    在这里,您只对 catch 子句中的违规行为指定了一个非常宽容的模式。变量声明不应受到影响,仍会检查原始模式。

    【讨论】:

    • 鲍里斯,谢谢你的回答。关于规则的使用。我们喜欢将规则用于本地变量。但对于 catch-blocks 它不适合。因此,我们通过抑制文件或通过正确配置规则以跳过 catch-blocks 以通用方式搜索禁用 localVar 和 localFinalVar 检查异常的选项。我们都找不到答案
    • @cilap 查看我的编辑。您可以调整规则以仅匹配给定模式的 catch 块。
    • 嗨,鲍里斯,我已经发布了完整的答案。你的提示有助于找到它。谢谢
    【解决方案2】:

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

    【讨论】:

    • 好点谢谢。您知道如何从异常中删除 checkstyle 规则吗?
    【解决方案3】:

    在 Boris 的帮助下,我找到了解决方案。这是一个与 checkstyle 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>
    

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 2013-07-23
      • 2015-07-12
      • 2021-10-09
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多