3

所以我从空值检查器那里得到这个错误

> Task :compileJava
/Users/calebcushing/IdeaProjects/ppm/scaf/src/main/java/com/xenoterracide/scaf/PebbleTemplateProcessor.java:94: error: [argument.type.incompatible] incompatible argument for parameter obj of requireNonNull.
        var console = Objects.requireNonNull( System.console() );
                                                            ^                                     ^

这是抱怨System.console()可能为空,在阅读 javadoc 时这是真的。所以我Objects.requireNonNull()现在把它包装起来,它抱怨参数requireNonNull不能为空,这显然不是真的。

我如何告诉NullnessChecker忽略Objects.requireNonNull()?我对明确的 NPE 很好,这只是我不想要的偶然的。我相信 checker 已经为此提供了一个存根。

4

2 回答 2

0

意识到我迟到了,但希望这会帮助其他在搜索后登陆这里的人。

您可以向 Checker 提供覆盖默认注释的存根文件。

对于我自己的项目,我在我的一个常见项目中的文件夹checker旁边创建了一个新文件src夹,并将其放入java.util.Objects.astub包含以下内容的存根文件中:

package java.util;

import org.eclipse.jdt.annotation.Nullable;

public class Objects
{
   public static <T> T requireNonNull(@Nullable T obj, String message);
}

然后我将它添加到我们的 Gradle 构建中:

checkerFramework {
   extraJavacArgs = [
      "-Astubs=${project(':my-project').file('checker')}"
   ]
}

my-project包含新文件夹的项目的 Gradle 标识符在哪里。

Checker 现在将加载该文件夹*.astub中的所有文件checker,并使用那里提供的注释而不是默认值。您可以在 Checker 文档中的Using Stub Classes中了解更多信息。

于 2021-09-28T20:20:25.970 回答
-1

编辑:以下答案是为原始帖子编写的,其中包含 3 个不相关的问题。(发帖人后来编辑了原帖。)我不知道为什么这个答案被否决了,因为它准确地回答了所有 3 个问题,并提供了更多信息的链接。

每个帖子问一个问题

第一个是抱怨System.console()可能为空,在阅读 javadoc 时这是真的。所以我Objects.requireNonNull()现在把它包装起来,它抱怨参数requireNonNull不能为空,这显然不是真的。

这在 Checker Framework 手册的介绍中得到了解答。

Nullness Checker 的目标是在程序可能抛出NullPointerException. 如果 的参数requireNonNull()null,那么您的程序会抛出NullPointerException. 因此,传递nullrequireNonNull()您的程序并不比传递null给可能取消引用它的任何其他例程更正确,并且 Nullness Checker 会对此发出警告。

你试图通过写来消除警告requireNonNull()。如上所述,这没有任何效果:程序仍然抛出NullPointerException. 相反,最好纠正根本问题。您的程序应该检查 null 并发出用户友好的消息而不是崩溃——无论崩溃是在您自己的代码中还是在requireNonNull().

第二个是抱怨 commons-lang3 参数不能为 null,但它的文档另有说明。

这也在Checker Framework 手册的介绍中得到解答。

Nullness Checker 读取注释,而不是英语 Javadoc 注释。为了让 Nullness Checker 知道toBoolean()可以接受 null 参数,它的签名toBoolean()需要注释为:

boolean toBoolean(@Nullable Boolean bool)

手册中所述,您可以编写该注释,以便 Nullness Checker 使用它。您还可以将 commons-lang 注释贡献回社区,以便其他人也可以从中受益。

我添加了 SuppressWarnings,不确定为什么它仍在发生。

您需要@SuppressWarnings在类的声明上写下发出警告的位置Application@SuppressWarnings你在程序的另一行写了。

于 2020-12-10T14:25:58.023 回答