Предупреждение FindBugs RV_ABSOLUTE_VALUE_OF_RANDOM_INT - PullRequest
8 голосов
/ 27 сентября 2011

Я пытаюсь сделать обзор кода для нашего проекта с использованием FindBugs.

у нас есть метод для генерации уникального идентификатора (случайным образом):

 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()).

У кого-нибудь есть объяснение, почему и как это исправить?

1 Ответ

18 голосов
/ 27 сентября 2011

Возможно, это связано с тем, что Math.abs может на самом деле возвращать отрицательные результаты для целочисленных входных данных :

assertTrue( Math.abs(Integer.MIN_VALUE) < 0 );

Однако он делает это только для MIN_VALUE, поскольку -MIN_VALUE не может быть представлена.Вид проблемы переполнения.

Что касается того, как ее исправить:

  • не создавайте свой собственный UUID.Используйте java.util.UUID .

  • приведите случайное число к заданному заданию перед вызовом Math.abs

  • используйте случайное.nextInt (Integer.MAX_VALUE), чтобы получить число от 0 до MAX_VALUE - 1

...