SonarQUBE 和 compareTo 日期

SonarQUBE and compareTo Dates

我遇到了这个声纳错误:

Use the original value instead. Rule: Neither "Math.abs" nor negation should be used on numbers that could be "MIN_VALUE"

在这种比较日期的方法中:

public int compareDates(MyDto a, MyDto b) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy hh:mm");
        try {
            Date dateA = sdf.parse(a.getStartDate() + " " + a.getStartHour());
            Date dateB = sdf.parse(b.getStartDate() + " " + b.getStartHour());
            return - dateA.compareTo(dateB); //Sonar BUG
        } catch (ParseException e) {
            logger.error("Unable to parse date: " + e.getMessage());
            return 0;
        }   
    }

我正在使用此方法按日期排序 MyDto 集合:

Collections.sort(myDtoList, (a,b) -> compareDates(a,b));

现在真的不知道怎么修改了。比较返回的整数可以是负数,也可以不是负数,我该如何解决才能让 SQ 开心?

IMO 这几乎是误报。

dateA.compareTo(dateB) 的结果可能 可以想象为 Integer.MIN_VALUE 在这种情况下 -dateA.compareTo(dateB)also evaluate to Integer.MIN_VALUE,因此不会产生你想要的结果。

实际上,调用 极有可能 到 return -101(即 not specified 仅 return 这些值,但我见过的 Date.compareTo() 的所有实现都这样做了)。

但是有一个非常简单的方法可以完全避免否定(以及因此这个特定问题):

如果你想要相反的方向就returndateB.compareTo(dateA)!只需交换您用作参数的内容与否定结果的效果相同,而没有声纳提到的风险。