我有以下代码:
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'
现在据我所知,事实并非如此,因为getBoolean()
可以是true
或false
,具体取决于生成的随机值。我在这里遗漏了什么,或者是IntelliJ Idea中的错误?
答案 0 :(得分:11)
这不是一个错误。这是一个特点:)
如果仔细查看IDE,它会告诉您对getBoolean()的第二次和第三次调用始终为false,但不是第一次。
Idea假定(在这种情况下不正确)您的方法(无参数且称为“get”...)将始终返回相同的值。
如果是这种情况,并且第一次调用是真的,则永远不会访问另一个(因为返回)。
如果第一个电话是假的,那么其他电话也是如此。
IDEA试图变得聪明w.r.t.良好的编码实践,但并非绝对可靠。
如果您更改方法以获取参数(或重命名它以使其看起来不像吸气剂)
public boolean getBoolean(int x) {
Random rand = new Random();
return rand.nextInt() > 100;
}
警告将消失(即使您始终使用相同的参数调用)。
(注意,即使它是一个getter,如果它是非final字段,它仍然是错误的,因为它可能在多线程环境中发生变化!)
答案 1 :(得分:2)
IDEA认为getBoolean(
)调用在第二次(或第三次)调用时不会更改。通常,如果返回相同的值,则永远不会实现第二次调用。这就是IDEA强调它的原因。
答案 2 :(得分:2)
不幸的是,尽管已接受的答案给出了很好的解释,但并非总是可以重命名触发方法,因为它们可能驻留在第三方代码中。例如,我使用的是MongoDB库中的first()函数,该函数显然可以返回空值,但是当我要测试其是否为空时会触发警告。
如果您确信IDEA弄错了,那就放
//noinspection ConstantConditions
引起问题的语句之前。
通常,一个方便的选项是“分析”菜单下的“检查代码...”。在这里,您可以查看整个项目,也可以查看您所关注的文件。您可能会发现比您讨价还价更多的关注领域!问题中的警告将列在“可能的错误”下。注意“可能”-IDEA知道它不是绝对可靠的:)
答案 3 :(得分:0)
在我的情况下,如果我使用MY_ACTUAL_CLASS_NAME.getBoolean(),它就不会抱怨(因为该方法是静态的)。可能是因为IntelliJ Idea没有考虑静态(这里可能存在错误)