首页 > 解决方案 > Checker Framework argument.type.incompatible 不受欢迎的正面

问题描述

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

> 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 已经为此提供了一个存根。

标签: javachecker-framework

解决方案


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

您可以向 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中了解更多信息。


推荐阅读