如何解决IntelliJ@Contact和Eclipse空分析之间的冲突导致的这一警告?

kkbh8khc  于 2022-09-20  发布在  Eclipse
关注(0)|答案(1)|浏览(187)

我这里有一段代码,它将可能为空值的值赋给@NotNull变量。

@NotNull String message = getMessage();
if (sender instanceof CommandSender) {
    message = ChatColor.stripColor(message);
}

请注意,ChatColor.stripColor()可以返回NULL,这会导致在Eclipse中出现警告。

Null类型不匹配(类型注解):需要‘@NotNull字符串’,但此表达式的类型为‘@Null able字符串’

我通过检查stripColor()的结果并在出现空值时使用默认字符串来解决这个问题。

@Nullable String m = ChatColor.stripColor(message);
if (m == null)
    m = "";
message = m;

虽然我更喜欢使用Eclipse,但我正在编写的代码正在提交给作者使用IntelliJ的项目。这种情况并不少见,我使用了他们的检查工具来检查任何其他可能在Eclipse中看不到的警告。我惊讶地发现,它在这一变化中存在问题。

但这怎么可能呢?它可以返回空!嗯,除非@Contract说它可以。ChatColor.stripColor()使用以下注解:

@Contract("!null -> !null; null -> null")

这是一个IntelliJ注解(org.jetbrains.annotations.Contract),它说明如果输入为非空,则输出也为非空。在这种情况下,消息是非空的。ECLIPSE可以导入此注解,但似乎不考虑将其用于空分析。

现在我有个问题了。如果我不解决这个空类型不匹配的问题,我将在Eclipse中得到一个错误。我不想关闭这一功能,因为我想看到这种信息。但如果我尝试在代码中解析它,IntelliJ会抛出一个警告,因为@Contract的结果是它有更多的信息。

有没有什么方法可以满足出现在Eclipse中的错误和出现在IntelliJ中的警告?

我也尝试使用Assert,但IntelliJ也标记了这一点:

@Nullable String m = ChatColor.stripColor(message);
assert(null != m);
message = m;
mwngjboj

mwngjboj1#

我会尝试使用私有方法来封装stripColor,并使参数可以为空。

@NotNull String message = getMessage();
if (sender instanceof CommandSender) {
    message = stripColor(message);
}

...

private @NotNull String stripColor(@Nullable message) {
    String result = ChatColor.stripColor(message);
    return null == result ? "" : result;
}

相关问题