Intellij Idea 提示:条件始终为假 - 此处可以为真吗? (Java)

Intellij Idea hint: Condition is always false - can that be true here? (Java)

我有以下代码:

public String testExitPoints() {
    boolean myBoolean = false;
    try {
        if (getBoolean()) {
            return "exit 1";
        }
        if (getBoolean()) {
            throw new RuntimeException();
        }
    } finally {
        myBoolean = true;
    }
    if (getBoolean()) {
        return "exit 2";
    }
    return "exit 3";
}

public static boolean getBoolean() {
    Random rand = new Random();
    return rand.nextInt() > 100;
}

现在 IntelliJ idea 为 getBoolean() 的第二次和第三次调用提供了以下提示:

Condition 'getBoolean()' is always 'false'

根据我的理解,这不是真的,因为 getBoolean() 可以是 truefalse,具体取决于生成的随机值。我在这里遗漏了什么,还是 IntelliJ Idea 中的错误?

IDEA 认为 getBoolean() 调用在第二次(或第三次)调用时没有改变。通常,如果您 return 相同的值,则永远无法实现第二次调用。这就是 IDEA 突出显示它的原因。

这不是错误。这是一个功能:)

如果您仔细查看 IDE,它会告诉您对 getBoolean() 的第二次和第三次调用始终为 false,但不是第一次。

Idea 假定(在这种情况下是错误的)您的方法是无参数的并被称为 "get"...,return 将始终具有相同的值。

如果是这样,并且第一个调用为真,则永远不会访问另一个(因为 return)。

如果第一个电话是错误的,那么其他电话也是。

IDEA 努力变聪明 w.r.t。良好的编码习惯,但并非万无一失。

如果您将方法更改为具有参数(或重命名它使其看起来不像 getter)

public  boolean getBoolean(int x) {
    Random rand = new Random();
    return rand.nextInt() > 100;
}

警告将消失(即使您始终使用相同的参数调用)。

(请注意,即使它是 getter,如果它用于非最终字段,它仍然是错误的,因为它可能会在多线程环境中发生变化!)

在我的例子中,如果我使用 MY_ACTUAL_CLASS_NAME.getBoolean() 它不会抱怨(因为该方法是静态的)。可能是因为 IntelliJ Idea 没有考虑静态(此处可能存在错误)

不幸的是,虽然接受的答案给出了很好的解释,但并不总是可以重命名触发方法,因为它们可能驻留在第三方代码中。例如,我使用了 MongoDB 库中的 first() 函数,它显然可以 return 一个空值,但是当我想测试它是否为空时触发了警告。

如果你确信 IDEA 弄错了,就把

                //noinspection ConstantConditions

在导致问题的语句之前。

一般来说,'Analyze' 菜单下的 'Inspect code...' 是一个方便的选项。在那里您可以查看整个项目,或只查看您关注的文件。您可能会发现比您预想的更多的关注领域!问题中的警告将列在 'probable bugs' 下。注意 "probable" - IDEA 知道它不是万无一失的:)