IntelliJ - 当 i 已知时,不会出现条件 i >= 2 的警告消息

Posted

技术标签:

【中文标题】IntelliJ - 当 i 已知时,不会出现条件 i >= 2 的警告消息【英文标题】:IntelliJ - Warning message does not appear for the condition i >= 2 when i is known 【发布时间】:2016-02-05 06:06:18 【问题描述】:

IntelliJ 上的以下程序

public static void main(String[] args) 
    int i = 0;
    if (i <= 2) 
        System.out.println("ok");
    

警告我“条件 'i i > 2 替换条件,我会得到“条件'i > 2'总是'假'”。与i == 2 相同。

但如果我用i &gt;= 2 替换它,我没有任何警告。

为什么在最后一种情况下 IntelliJ 没有警告我这个条件总是错误的?

我使用的是 IntelliJ 14.1.5,使用的编译器是 1.8.0_51 版本的 javac。

【问题讨论】:

似乎是 Intellij 实现中的一个错误,而不是 Java 问题。我建议将此报告给 JetBrains。 我认为没有什么深层次的原因。它一定只是一个错误,但它是一个相当奇怪的错误。如果我这样做 int i = 5; if (i &lt;= 2) 我不会收到警告。 可能是youtrack.jetbrains.com/issue/IDEA-146950 我投票结束这个问题,因为它更像是一个错误报告而不是一个问题 【参考方案1】:

就像 Paul Boddington 在评论中所说的那样,JetBrains 忘记在他们的算法中实现它实际上是 fixed a few days ago。

之前:

if (opSign == LT && comparedWith <= rangeMin) return alwaysFalse(instruction, runner, memState);
if (opSign == LT && comparedWith > rangeMax) return alwaysTrue(instruction, runner, memState);
if (opSign == LE && comparedWith >= rangeMax) return alwaysTrue(instruction, runner, memState);

if (opSign == GT && comparedWith >= rangeMax) return alwaysFalse(instruction, runner, memState);
if (opSign == GT && comparedWith < rangeMin) return alwaysTrue(instruction, runner, memState);
if (opSign == GE && comparedWith <= rangeMin) return alwaysTrue(instruction, runner, memState);

之后:

if (opSign == LT && comparedWith <= rangeMin) return alwaysFalse(instruction, runner, memState);
if (opSign == LT && comparedWith > rangeMax) return alwaysTrue(instruction, runner, memState);
if (opSign == LE && comparedWith >= rangeMax) return alwaysTrue(instruction, runner, memState);
if (opSign == LE && comparedWith < rangeMin) return alwaysFalse(instruction, runner, memState);

if (opSign == GT && comparedWith >= rangeMax) return alwaysFalse(instruction, runner, memState);
if (opSign == GT && comparedWith < rangeMin) return alwaysTrue(instruction, runner, memState);
if (opSign == GE && comparedWith <= rangeMin) return alwaysTrue(instruction, runner, memState);
if (opSign == GE && comparedWith > rangeMax) return alwaysFalse(instruction, runner, memState);

对应问题:https://youtrack.jetbrains.com/issue/IDEA-146950

【讨论】:

【参考方案2】:

大约一周前引起了我的注意,所以我很快也在这里看到了它,这很有趣。我调查了它,它显然早在 Intellij 10 就已经发生了。在所有更新中都有一些错误修复,但问题尚未得到明确修复。

这是 Jetbrains 引用该错误的链接。有多种情况。 IDEA-84489

如果它困扰您,请尝试在光标悬停时通过 Alt+Enter 抑制警告,然后选择“抑制...”选项

【讨论】:

以上是关于IntelliJ - 当 i 已知时,不会出现条件 i >= 2 的警告消息的主要内容,如果未能解决你的问题,请参考以下文章

Intellij 在运行时不会检测到代码更改

IntelliJ 在运行所有测试时不会刷新多模块测试中的 Spring 自动配置

Intellij IDEA Java 类不会在保存时自动编译

Intellij Idea问题之Authentication Failed 错误

IntelliJ Idea with Git:当自动合并崩溃时,如何继续手动合并

python编程基础之十一