Mat*_*der 14 java intellij-idea control-flow
我有以下代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在IntelliJ的想法给了我getBoolean()以下提示的第二次和第三次调用:
Condition 'getBoolean()' is always 'false'
Run Code Online (Sandbox Code Playgroud)
现在据我所知,这不是真的,因为getBoolean()可以是true或者false,取决于生成的随机值.我在这里遗漏了什么,或者是IntelliJ Idea中的错误?
Die*_*oia 12
这不是一个错误.这是一个功能:)
如果仔细查看IDE,它会告诉您对getBoolean()的第二次和第三次调用始终为false,但不是第一次.
Idea假设(在这种情况下不正确)您的方法,无参数并称为"get"...,将始终返回相同的值.
如果是这种情况,并且第一次调用是真的,则永远不会访问另一个(因为返回).
如果第一个电话是假的,那么其他电话也是如此.
IDEA试图通过良好的编码实践来实现智能,但这并非绝对可靠.
如果您更改方法以获取参数(或重命名它以使其看起来不像吸气剂)
public boolean getBoolean(int x) {
Random rand = new Random();
return rand.nextInt() > 100;
}
Run Code Online (Sandbox Code Playgroud)
警告将消失(即使您始终使用相同的参数调用).
(注意,即使它是一个getter,如果它是非final字段,它仍然是错误的,因为它可能在多线程环境中发生变化!)
不幸的是,虽然接受的答案给出了很好的解释,但并不总是可以重命名触发方法,因为它们可能驻留在第三方代码中。例如,我使用了 MongoDB 库中的 first() 函数,它显然可以返回一个空值,但是当我想测试它是否为空时触发了警告。
如果您确信 IDEA 弄错了,请输入
//noinspection ConstantConditions
Run Code Online (Sandbox Code Playgroud)
在导致问题的语句之前。
通常,一个方便的选项是“分析”菜单下的“检查代码...”。在那里您可以查看整个项目,或仅查看您关心的文件。您可能会发现比您预想的更多的关注领域!问题中的警告将列在“可能的错误”下。注意“可能”——IDEA 知道它不是绝对可靠的 :)
| 归档时间: |
|
| 查看次数: |
11514 次 |
| 最近记录: |