2011-09-27 6 views
8

Próbuję zrobić przegląd kodu dla naszego projektu za pomocą FindBugs.FindBugs RV_ABSOLUTE_VALUE_OF_RANDOM_INT ostrzeżenie

mamy metodę, aby wygenerować unikalny identyfikator (losowo):

public static String generateUUID(int base){ 

    return String.valueOf(getCurrentTimeInNanos((long)base)) + 

        String.valueOf(Math.abs(random.nextInt())); 
} 

i findBugs wskazuje RV_ABSOLUTE_VALUE_OF_RANDOM_INT ostrzegawcze (rv: Bad próbę obliczyć wartość bezwzględną podpisanego 32-bitowy losowej liczby całkowitej), chyba problem jest w String.valueOf(Math.abs(random.nextInt()).

, więc jeśli masz wyjaśnienie, dlaczego tak jest i jak to naprawić?

dzięki.

Odpowiedz

18

Może to dlatego Math.abs can actually return negative results for integer inputs:

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

Robi to tylko dla MIN_VALUE, chociaż, ponieważ -MIN_VALUE nie mogą być reprezentowane. Rodzaj problemu z przelewem.

chodzi o jak to naprawić:

  • nie zrobić własną UUID. Użyj java.util.UUID.

  • oddania liczby losowe na długo przed wywołaniem Math.abs

  • użycie random.nextInt (Integer.MAX_VALUE), aby uzyskać numer od 0 do MAX_VALUE - 1