Checkstyle 报告捕获异常参数的 LocalFinalVariableNameCheck 错误

Checkstyle reports LocalFinalVariableNameCheck error on catch-exception parameter

我有一个奇怪的问题,我不确定这是两只耳朵之间的问题还是 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 块定义为局部变量而不是参数?

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

正如@Dongqing指出的那样,pEx确实是一个局部变量,所以检查适用于这里。

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

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

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

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

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

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

在鲍里斯的帮助下,我找到了解决办法。这是一个与 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>