Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”

今天早上旁边同事喊我看一个Sonar检测出的问题:
Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”_第1张图片
当时看了好几眼没觉得这个有太大问题,于是又看了下Sonar建议:
Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”_第2张图片
这是说Math.abs()方法使用在数字上面可能返回最小值,觉得这个挺有意思的,于是Google一下:

在Oracle docs: Integer Operations中有这么一段话:

The integer operators do not indicate overflow or underflow in any way.

整数的操作不会告诉我们向上溢出还是向下溢出。
所以,溢出的结果已由语言指定,独立于JVM版本,Integer.MAX_VALUE + 1 == Integer.MIN_VALUE 和 Integer.MIN_VALUE - 1 == Integer. MAX_VALUE。其他整数类型也是如此。

原子整形对象 (AtomicInteger, AtomicLong, etc.) 内部使用正常的整形去操作,所有类似getAndDecrement()方法的操作都表现一样。

所以最终把方法改成new Random().nextInt(Integer.MAX_VALUE)就好了。

参考

  • Oracle doc: Integer Operations
  • What happens when you increment an integer beyond its max value?
  • Overflow And Underflow of Data Types in Java
  • sonar问题Use the original value instead should be used on numbers that could be MIN_VALUE

你可能感兴趣的:(Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”)