4

大约一周前,我们开始在测试中遇到此错误。它一直在开启和关闭——有时人们会得到它,而有时他们不会。

/.../product/integration/src/test/java/com/acme/integration/code/CodeTestUtils.java:74: error: invalid use of @throws
         * @throws Exception if an error occurs.

我想错误信息有点模糊。无效怎么办?代码对我来说看起来不错:

    /**
     * Iterates to find modules and then calls
     * {@link #checkModule(Path, String, DirectoryStream.Filter, CheckFile)} for each.
     *
     * @param subPath the path within each module to start checks from.
     * @param filter the filter to apply to choose which files to check.
     * @param checkFile the checks to perform on each file.
     * @throws Exception if an error occurs.
     */
    public static void checkProject(String subPath, DirectoryStream.Filter<Path> filter, CheckFile checkFile) throws Exception
    {
        for (Path file : listFiles(EnvironmentUtils.getDevelopmentRoot().toPath()))
        {
            if (FileUtils.isDirectory(file) && FileUtils.exists(file.resolve("src/java")))
            {
                checkModule(file, subPath, filter, checkFile);
            }
        }
    }

我们确实在编译期间打开了doclint,因为我们想查找有关Javadoc 错误的信息,而不必单独运行Javadoc。

这个错误到底是什么意思?我们在这里所做的有什么无效的吗?我们是否正在查看编译器错误?当然,像这样的错误会打击第一个试图声明方法抛出异常的人...... :(

目前调查...

  • 我设法将示例缩减为一个给出相同错误的简单项目。除了 Travis CI 能够在 Linux 上重现它之外,我可以在 macOS 上重现它,从今天开始(不知道为什么这是时间相关的!)Windows 上的其他用户已经讨论了几天了。
  • 从这个项目中,我查看了 Gradle 用于 javac 的命令行,并设法得到相同的错误,以显示直接调用 javac。
  • 进一步减少 javac 命令行:

    javac -source 1.8 -target 1.8 -d build/classes/test \
      -classpath build/classes/main:build/resources/main:$HOME/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.8.2/979fc0cf8460302e4ffbfe38c1b66a99450b0bb7/log4j-core-2.8.2.jar:$HOME/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.8.2/e590eeb783348ce8ddef205b82127f9084d82bf3/log4j-api-2.8.2.jar \
      -Xdoclint:all,-missing \
      src/test/java/com/acme/CodeTestUtils.java
    

    这说明在图片中没有Gradle的情况下问题依然存在。(Gradle 也添加-processorpath-g。)

4

3 回答 3

3

我最终对 Log4j 提出投诉,认为即使它是 javac 中的错误,Oracle 也永远不会修复我们报告的关键错误。

显然,Log4j 的自定义注释处理以某种方式导致了问题 - 那里的注释建议添加-proc:none到 javac 命令行以关闭所有注释处理,事实上,在注释处理关闭的情况下,编译现在可以工作了!

究竟为什么它的注释处理器会导致这种情况仍然是一个谜。我阅读了代码,但它似乎没有修改任何现有的类。

于 2017-06-01T03:14:19.347 回答
2

根据 DocLint OpenJDK源代码,此消息与“dc.invalid.throws”属性相关联,如果您使用具有非异常类型的 @throws 标记或使用它在构造函数或方法以外的东西上。

这些似乎都不适用于您的情况。但是,我看到一些人抱怨他们在构建不一致时收到此消息 - 响应通常是进行完全重建。

例如,与相同错误消息相关的这个 Lucene Jira,响应是:

这些错误通常会发生(尤其是在 Solr 的构建中),如果输出文件夹中仍有过时的类文件,或者之前的编译运行失败。

于 2017-05-31T05:42:29.037 回答
1

我在没有 Log4j 的情况下复制了这个问题。该项目位于https://github.com/rgoers/LOG4J2-1925。据我所知,任何注释处理器都会发生这种情况。

此错误已在http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8186647向 Oracle 提交。

于 2017-08-22T17:22:58.903 回答