Intellij Idea提示:条件总是假的 - 这里真的是真的吗?(爪哇)

2022-09-02 10:00:47

我有以下代码:

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的想法给了我以下提示的第二次和第三次调用:getBoolean()

Condition 'getBoolean()' is always 'false'

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


答案 1

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

如果你在 IDE 中仔细查看,它会告诉你,对 getBoolean() 的第 2 次和第 3 次调用总是假的,但不是第一个调用。

Idea假设(在这种情况下是错误的)你的方法,无参数,称为“get”...,将始终返回相同的值。

如果是这种情况,并且第一个调用为 true,则永远不会访问另一个调用(因为返回)。

如果第一个电话是假的,那么其他人也会是假的。

IDEA试图成为聪明的w.r.t.良好的编码实践,但它并不是万无一失的。

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

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

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

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


答案 2

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

如果您确信IDEA弄错了,只需将

                //noinspection ConstantConditions

在导致问题的语句之前。

通常,一个方便的选择是“检查代码...”。在“分析”菜单下。在那里,您可以查看整个项目,或者只是您关注的文件。您可能会发现比您讨价还价的更多的关注领域!问题中的警告将列在“可能的错误”下。注意“可能” - IDEA知道它不是万无一失的:)


推荐