我正在尝试使用FindBugs对我们的项目进行代码审查。
我们有一个生成唯一ID(随机)的方法:
public static String generateUUID(int base){
return String.valueOf(getCurrentTimeInNanos((long)base)) +
String.valueOf(Math.abs(random.nextInt()));
}
和findBugs表示RV_ABSOLUTE_VALUE_OF_RANDOM_INT
警告(RV:尝试计算有符号32位随机整数的绝对值),我想问题出在String.valueOf(Math.abs(random.nextInt())
。
有没有人解释为什么会这样以及如何解决?
答案 0 :(得分:18)
也许是因为Math.abs can actually return negative results for integer inputs:
assertTrue( Math.abs(Integer.MIN_VALUE) < 0 );
它只对MIN_VALUE执行此操作,因为无法表示-MIN_VALUE。有点溢出问题。
至于如何修复它:
不要制作自己的UUID。使用java.util.UUID。
在调用Math.abs
使用random.nextInt(Integer.MAX_VALUE)获取0到MAX_VALUE之间的数字 - 1