我有一个接口(interface),方法如下:
public interface MyInterface {
void myMethod(@Nonnull String userEmail);
}
接口(interface)实现如下:
public class MyInterfaceImpl implements MyInterface {
@Override
public void myMethod(@Nonnull String userEmail) {
if ((userEmail== null) || !userEmail.endsWith("something")) {
throw new SomeException("...");
}
...
}
}
编译器向我发出警告说 Condition 'userEmail == null' is always 'false'
,但这看起来不对。
据我所知,注释 javax.annotation.Nonnull
将警告编译器,以防有人使用 null
值调用我的方法,但不会阻止代码如果有人向它传递空值,则进行编译。所以是的,我的代码可以在某些时候用 null
值调用:
请注意,如果我在命令行上使用选项 -Xlint:all
进行编译,我会收到相同的警告(因此它看起来不像是我的 IDE 中的错误)。
有谁知道我怎样才能摆脱这个警告以及它为什么会发生?
免责声明:我展示的例子只是一个例子,实际代码在达到那个条件之前做了一些事情,但没有什么可以使 userEmail == null
总是 false
(正如我附加的调试器屏幕截图所证明的那样)。
最佳答案
正如很多人在评论中提到的那样。它的行为符合预期。来自https://checkerframework.org/manual/#nullness-checker的解释清楚地说明这里发生了什么:
The checker issues a warning in these cases: When an expression of @NonNull type might become null, because it is a misuse of the type: the null value could flow to a dereference that the checker does not warn about.
上述警告仅在您将 -Alint=redundantNullComparison
传递给编译器时出现,并且默认情况下处于关闭状态。当您使用 -Xlint:all
进行编译时,甚至会启用此警告。
如果您不想在 itellij 上看到此警告,您可以更新您的设置:
设置 (Ctrl+Alt+S/⌘) > 编辑器 > 检查 > Java > 声明冗余> 使用明显非空参数调用空检查方法。
或
设置 (Ctrl+Alt+S/⌘) > 构建、执行、部署 > 编译器 >为非空注释方法和参数添加运行时断言
或
设置 (Ctrl+Alt+S/⌘) > 编辑器 > 检查 > Java > 可能的错误
此外,如果您期望一个空值,那么一开始就使用该注释似乎是不正确的。
关于java - "Condition is always false"来自编译器的警告条件实际上可能为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67833401/