2011-09-27 22 views
8

Estoy tratando de hacer una revisión de código para nuestro proyecto utilizando FindBugs.FindBugs RV_ABSOLUTE_VALUE_OF_RANDOM_INT advertencia

tenemos un método para generar identificación única (al azar):

public static String generateUUID(int base){ 

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

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

y FindBugs nos indica RV_ABSOLUTE_VALUE_OF_RANDOM_INT advertencia (RV: Bad intento de calcular el valor absoluto de firmado entero aleatorio de 32 bits), supongo que el problema está en String.valueOf(Math.abs(random.nextInt()).

así que si tiene una explicación de por qué es esto y cómo solucionarlo?

gracias.

Respuesta

18

Tal vez sea porque Math.abs can actually return negative results for integer inputs:

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

Sólo hace esto para MIN_VALUE, sin embargo, porque -MIN_VALUE no se puede representar. Tipo de un problema de desbordamiento

cuanto a cómo solucionarlo:

  • no hace su propia UUID. Use java.util.UUID.

  • emitir el número aleatorio a largo antes de llamar Math.abs

  • uso random.nextInt (Integer.MAX_VALUE) para obtener un número de 0 a MAX_VALUE - 1

Cuestiones relacionadas