了解CheckStyle Check" JavadocMethod",property" logLoadErrors"

时间:2016-09-15 08:38:37

标签: java javadoc checkstyle

阅读检查JavadocMethod的CheckStyle文档我不理解属性logLoadErrors

我们被告知

  

此检查可能需要加载@throws标记中提到的异常类,以检查它们是否为RuntimeExceptions。如果加载类失败,则此属性允许控制checkstyle的错误处理。如果设置为false,则假定类路径配置问题,并且TreeWalker完全停止对类进行操作。如果设置为true(默认值),checkstyle会在javadoc中假定拼写错误或重构问题,并将问题记录在正常的checkstyle报告中(可能会掩盖配置错误)。

此外,属性suppressLoadErrors描述如下:

  

当logLoadErrors设置为true时,TreeWalker会完全处理一个类,并显示加载异常作为checkstyle违规的任何问题。当此属性设置为true时,将禁止在logLoadErrors设置为true时生成的违规在checkstyle报告中报告为违规。

我首先想到的是标准配置logLoadErrors = true, suppressLoadErrors = false如果找不到@throws标记中提到的Exception类,CheckStyle会发出警告。我试过这个例子:

 /**
  * Returns if the first of two given numbers is smaller than the other one.
  * @param a Description param a
  * @param b Description param b
  * @throws Exception bla
  * @throws MyException foo
  */
public boolean javadocMethod(int a, int b) throws Exception, MyException {
    return a < b;
}

我以为我会在运行CheckStyle时收到警告,因为类MyException不存在。但我没有得到任何警告。有些人可以提供另一个例子吗?

2 个答案:

答案 0 :(得分:0)

这是一个非常好的问题,它与Checkstyle工具的一个较为阴影的区域有关。事实上,在JavadocMethodCheck的父类AbstractTypeAwareCheck的源代码中,它说:

  

Checkstyle不是类型感知工具,所有从此类派生的Checks都可能不稳定。

在我看来,这有点悲观,因为如果配置正确,它的逻辑应该工作得很好,但当然它取决于运行时的实际类路径配置。

Checkstyle code中,您询问的选项是这样的(这里简化为伪代码):

protected void logLoadErrorImpl(int lineNo, int columnNo, ...) {
    if (!logLoadErrors) {
        // throw an exception
    }
    if (!suppressLoadErrors) {
        // report a Checkstyle violation
    }
}

因此,每当Checkstyle尝试加载一个类(在您的情况下为MyException),并且此操作失败时,它将评估这些标志以确定要执行的操作。

如果您信任您的类路径(我们通常会这样做),您希望突出显示Javadoc中的错误,因此您需要将suppressLoadErrors设置为false。如果您不信任类路径,则应将suppressLoadErrors设置为true。您永远不会将logLoadErrors更改为默认值true之外的其他内容,因为这会阻止Checkstyle执行其他有意义的操作。

如果我从throws子句中删除不存在的异常,那么您的示例实际上会为我生成警告:

/**
 * Returns if the first of two given numbers is smaller than the other one.
 * @param a Description param a
 * @param b Description param b
 * @throws Exception bla
 * @throws MyException foo
 */
public boolean javadocMethod(int a, int b) throws Exception {
    return a < b;
}

不编译的代码通常不会发送到代码质量工具(或仅发送到以前的本地版本),因此这可能是IDE的特殊性。

这个答案基于Checkstyle 7.1.1。希望它有所启发!

答案 1 :(得分:0)

此属性已删除,因此从v8.28起不可用。

您可以找到更多信息here