Intellij idea Intellij提示条件始终为真-它如何知道?

Intellij idea Intellij提示条件始终为真-它如何知道?,intellij-idea,Intellij Idea,学生们得到了一个练习来练习基本的软件开发实践,我决定自己来演练一下,看看会怎么样。具体地说,编写一个将整数(即unix时间戳)转换为格式化字符串的程序。练习TDD是练习的一部分,所以我自己也做过 换句话说,我不是试图让当前失败的测试优雅地通过,而是试图让它尽可能简单地通过,并在出现重构机会时寻找重构机会 我用Intellij IDEA在Java11中实现了这一点 这就是我目前所处的状态。“1970-03-01 00:00:00”的时间戳错误地返回了“1970-02-29 00:00:00”,因此

学生们得到了一个练习来练习基本的软件开发实践,我决定自己来演练一下,看看会怎么样。具体地说,编写一个将整数(即unix时间戳)转换为格式化字符串的程序。练习TDD是练习的一部分,所以我自己也做过

换句话说,我不是试图让当前失败的测试优雅地通过,而是试图让它尽可能简单地通过,并在出现重构机会时寻找重构机会

我用Intellij IDEA在Java11中实现了这一点

这就是我目前所处的状态。“1970-03-01 00:00:00”的时间戳错误地返回了“1970-02-29 00:00:00”,因此我进行了适当的调整。我对3月2日和3月3日的时间戳也有类似的问题,下面的代码中有一个简单的修正

public MyTime(int i) {
    timestamp = i;

    months = (timestamp / (31*86400) % 12) + 1;
    days = (timestamp / 86400 % 31) + 1;
    hours = timestamp / 3600 % 24;
    minutes = timestamp / 60 % 60;
    seconds = timestamp % 60;

    if (months == 2 && days > 28) {
        months = 3;
        if (days == 29) {
            days = 1;
        } else if (days == 30) {
            days = 2;
        } else if (days == 31) {
            days = 3;
        }

    }
}
这里最明显的重构是
days-=28
,它暗示了更通用的
daysInMonth()。。。所有的除法和模运算都需要工作

我的实际问题是关于
elseif(days==31)
语句。Intellij给了我一个警告,这个条件总是正确的。我的意思是,它是,因为天数是
(x%31)+1
,但对于IDE来说,这似乎是一件非常复杂的事情


有人知道它在引擎盖下做什么吗?

IntelliJ IDEA可以执行非常聪明的数据流分析。如果由于
(x%31)+1
,您不确定此零件是否标记为始终正确,则可以将31增加到32,警告将消失


下面是blockpost,其中有一些总是正确和总是错误的检查示例:

他们的分析器非常好,但是在得出任何结论之前,我会小心。虽然可能是这样(他们为每个变量保留一个范围状态,并根据变量计算/测试缩小范围,在这里不容易出错),但有时这是错误的。在PhpStorm(同一个引擎)中,测试
if($array)
然后在一个循环中缩小数组,在循环之后,同样的测试
if($array)
它说它总是正确的,基本上是“你,笨蛋,做了上面几行测试…”,因为它不能推断数组可能会缩小(在php
if(emptyArray)中)
为假)