今天早上旁边同事喊我看一个Sonar检测出的问题:
当时看了好几眼没觉得这个有太大问题,于是又看了下Sonar建议:
这是说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