【问题标题】:SonarQUBE and compareTo DatesSonarQUBE 和 compareTo 日期
【发布时间】:2021-07-02 08:47:40
【问题描述】:

我得到了这个声纳错误:

改为使用原始值。规则:既不是“Math.abs”也不是否定 应该用于可能是“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 开心?

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    IMO 这几乎是误报。

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

    实际上,该调用极有可能返回-101(即not specified 只返回这些值,但Date.compareTo() 的所有实现我见过这样做的)。

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

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

    【讨论】:

    • SonarQube 似乎无法识别 Date.compareTo 返回 -1, 0, 1。不知道本地类的 compareTo 是否会出现同样的问题。
    • @JoopEggen:-101 部分只是一个通用约定,但它未指定。文档只是说“小于0的值”。所以理论上符合compareTo的实现在这种情况下可以返回Integer.MIN_VALUE。这会在 OP 发布的那种代码中引起问题。 IMO 最好在两种情况下保持安全:实施 compareTo 坚持-101,以及调用 compareTo,确保您可以处理返回的任何负值,包括Integer.MIN_VALUE
    • 您对 compareTo 的合同是正确的。另一个 JDK 可以做减法。
    猜你喜欢
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    相关资源
    最近更新 更多