java - "Condition is always false"来自编译器的警告条件实际上可能为真

标签 java compiler-warnings

我有一个接口(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 值调用:

Compiler warning


Debugging with a null value

请注意,如果我在命令行上使用选项 -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/

相关文章:

java - OpenGL 和 DirectX

java - getValueAt() 将数据库中的条目加倍

java - 如何替换已弃用的方法 Date.setHours(int)?

java - 可以脱离其他类(class)吗?

c - 警告 TokenList 类型转换

c++ - 带有继承析构函数的警告 C4710(未内联)

c++ - 如果返回值未用于特定类型,则编译失败

java - 如何忽略级别@RequestMapping()而直接调用方法级别@RequestMapping()?

visual-studio-2010 - VS2010(旧版)安装程序项目 - 两个或多个对象具有相同的目标位置

c - 不确定为什么编译器会提示......函数 strchrnul 的隐式声明