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

时间:2018-11-25 19:14:37

标签: intellij-idea

让学生练习了基本的软件开发实践,因此我决定亲自进行一次测试,看看它会如何发展。具体来说,编写将整数(即unix时间戳)转换为格式化字符串的程序。练习TDD是练习的一部分,所以我自己做了。

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

我正在使用Intellij IDEA在Java 11中进行此操作。

这是我当前所处的状态。“ 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(),供以后使用...所有除法和模数运算也需要工作。

我的实际问题是关于else if (days == 31)语句。 Intellij给我警告,此条件始终为真。我的意思是说,因为天数是(x % 31) + 1,但IDE似乎认为这是一件 真的 复杂的事情。

有人知道它在做什么吗?

1 个答案:

答案 0 :(得分:0)

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

此处是带有一些始终为真始终为假检查的示例的公告:https://blog.jetbrains.com/idea/2018/01/fumigating-the-idea-ultimate-code-using-dataflow-analysis/