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]*$
。因此,在消除违规之前,您可能应该确保命名模式真的没问题(如果不合适,为什么要定义自定义规则?)。
如果你真的想摆脱这种违规行为,Checkstyle 提供了多种方法来抑制警告。您可以:
- 使用 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>
我有一个奇怪的问题,我不确定这是两只耳朵之间的问题还是 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]*$
。因此,在消除违规之前,您可能应该确保命名模式真的没问题(如果不合适,为什么要定义自定义规则?)。
如果你真的想摆脱这种违规行为,Checkstyle 提供了多种方法来抑制警告。您可以:
- 使用 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>