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
,因此不会产生您想要的结果。
实际上,该调用极有可能返回-1
、0
或1
(即not specified 只返回这些值,但Date.compareTo()
的所有实现我见过这样做的)。
但是有一个非常简单的方法可以完全避免否定(以及这个特定问题):
如果你想要相反的方向,只需返回dateB.compareTo(dateA)
!只需交换您用作参数的内容与否定结果的效果相同,而没有声纳提到的风险。
【讨论】:
SonarQube 似乎无法识别Date.compareTo
返回 -1, 0, 1。不知道本地类的 compareTo 是否会出现同样的问题。
@JoopEggen:-1
、0
、1
部分只是一个通用约定,但它未指定。文档只是说“小于0
的值”。所以理论上符合compareTo
的实现在这种情况下可以返回Integer.MIN_VALUE
。这会在 OP 发布的那种代码中引起问题。 IMO 最好在两种情况下保持安全:实施 compareTo
坚持-1
、0
和1
,以及调用 compareTo
,确保您可以处理返回的任何负值,包括Integer.MIN_VALUE
。
您对 compareTo 的合同是正确的。另一个 JDK 可以做减法。以上是关于SonarQUBE 和 compareTo 日期的主要内容,如果未能解决你的问题,请参考以下文章