Intellij idea Intellij提示条件始终为真-它如何知道?
学生们得到了一个练习来练习基本的软件开发实践,我决定自己来演练一下,看看会怎么样。具体地说,编写一个将整数(即unix时间戳)转换为格式化字符串的程序。练习TDD是练习的一部分,所以我自己也做过 换句话说,我不是试图让当前失败的测试优雅地通过,而是试图让它尽可能简单地通过,并在出现重构机会时寻找重构机会 我用Intellij IDEA在Java11中实现了这一点 这就是我目前所处的状态。“1970-03-01 00:00:00”的时间戳错误地返回了“1970-02-29 00:00:00”,因此我进行了适当的调整。我对3月2日和3月3日的时间戳也有类似的问题,下面的代码中有一个简单的修正Intellij idea Intellij提示条件始终为真-它如何知道?,intellij-idea,Intellij Idea,学生们得到了一个练习来练习基本的软件开发实践,我决定自己来演练一下,看看会怎么样。具体地说,编写一个将整数(即unix时间戳)转换为格式化字符串的程序。练习TDD是练习的一部分,所以我自己也做过 换句话说,我不是试图让当前失败的测试优雅地通过,而是试图让它尽可能简单地通过,并在出现重构机会时寻找重构机会 我用Intellij IDEA在Java11中实现了这一点 这就是我目前所处的状态。“1970-03-01 00:00:00”的时间戳错误地返回了“1970-02-29 00:00:00”,因此
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)
它说它总是正确的,基本上是“你,笨蛋,做了上面几行测试…”,因为它不能推断数组可能会缩小(在phpif(emptyArray)中)
为假)