SonarQUBE 和 compareTo 日期

Posted

技术标签:

【中文标题】SonarQUBE 和 compareTo 日期【英文标题】:SonarQUBE and compareTo Dates 【发布时间】: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 开心?

【问题讨论】:

【参考方案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 可以做减法。

以上是关于SonarQUBE 和 compareTo 日期的主要内容,如果未能解决你的问题,请参考以下文章

参数中带有日期时间的 Sonarqube API 响应

java输入的日期与当前的日期做比较?

如何获取过去 6 个月内为 sonarqube 创建的项目的报告?

Sonarqube 5.5和mariadb

十分钟搭建和使用sonarqube代码质量管理平台

SonarQube - 无法连接到没有代理的更新中心