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 -1
、0
或 1
(即 not specified 仅 return 这些值,但我见过的 Date.compareTo()
的所有实现都这样做了)。
但是有一个非常简单的方法可以完全避免否定(以及因此这个特定问题):
如果你想要相反的方向就returndateB.compareTo(dateA)
!只需交换您用作参数的内容与否定结果的效果相同,而没有声纳提到的风险。
我遇到了这个声纳错误:
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 -1
、0
或 1
(即 not specified 仅 return 这些值,但我见过的 Date.compareTo()
的所有实现都这样做了)。
但是有一个非常简单的方法可以完全避免否定(以及因此这个特定问题):
如果你想要相反的方向就returndateB.compareTo(dateA)
!只需交换您用作参数的内容与否定结果的效果相同,而没有声纳提到的风险。