【问题标题】:FindBugs RV_ABSOLUTE_VALUE_OF_RANDOM_INT warningFindBugs RV_ABSOLUTE_VALUE_OF_RANDOM_INT 警告
【发布时间】:2011-09-27 10:02:45
【问题描述】:

我正在尝试使用 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())

有没有人解释为什么会这样以及如何解决它?

【问题讨论】:

    标签: java findbugs


    【解决方案1】:

    也许是因为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 之前将随机数转换为 long

    • 使用 random.nextInt(Integer.MAX_VALUE) 获取一个从 0 到 MAX_VALUE - 1 的数字

    【讨论】:

    • 由于没有 random.nextLong(long) 方法,您可以将其用作快速破解: Math.abs( Math.max(random.nextLong(), Long.MIN_VALUE + 1) ) : 保证结果在 0..Long.MAX_VALUE 范围内。
    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2016-11-02
    • 1970-01-01
    相关资源
    最近更新 更多