2012-02-26 9 views
5

si quiero convertir una cadena en un int en Java se puede saber si hay una manera para mí para detectar desbordamiento? con eso quiero decir que el literal de la cadena realmente representa un valor que es mayor que MAX_INT?cómo detectar desbordamiento cuando la cadena convertido a entero en Java

java doc no lo mencionó .. sólo dice que si la cadena no se puede analizar como un entero, será a través FormatException no mencionó una palabra sobre el desbordamiento ..

+0

http://stackoverflow.com/questions/8030485/java-integer-parseint-failed- to-parse-a-string –

+0

@darkmist Gracias. Saber que arroja una excepción ayuda. Todavía tengo que saber qué tipo de excepción y tal ... ¿Podría indicarme la documentación que describe el comportamiento? – yangsuli

+0

'NumberFormatException' (' 'parseInt' declaradas como static int parseInt pública (String s, int base) throws NumberFormatException'). Por cierto, hay una muestra en http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html para un número demasiado largo que no cabe en 'int'. –

Respuesta

8

Si quiero convertir una cadena en un int en Java se puede saber si hay una manera para mí para detectar desbordamiento?

Sí. La captura de excepciones de análisis sintáctico sería el enfoque correcto, pero la dificultad aquí es que Integer.parseInt(String s) genera un error NumberFormatException para cualquier de análisis, incluyendo desbordamiento. Puede verificarlo mirando el código fuente de Java en el archivo src.zip del JDK. Por suerte, existe un constructor BigInteger(String s) que lanzar excepciones de análisis sintáctico idénticos, excepto para los más de limitación de rango, porque BigInteger s no tienen límites. Podemos usar este conocimiento para atrapar el caso de desbordamiento:

/** 
* Provides the same functionality as Integer.parseInt(String s), but throws 
* a custom exception for out-of-range inputs. 
*/ 
int parseIntWithOverflow(String s) throws Exception { 
    int result = 0; 
    try { 
     result = Integer.parseInt(s); 
    } catch (Exception e) { 
     try { 
      new BigInteger(s); 
     } catch (Exception e1) { 
      throw e; // re-throw, this was a formatting problem 
     } 
     // We're here iff s represents a valid integer that's outside 
     // of java.lang.Integer range. Consider using custom exception type. 
     throw new NumberFormatException("Input is outside of Integer range!"); 
    } 
    // the input parsed no problem 
    return result; 
} 

Si realmente necesita personalizar esto para sólo entradas Integer.MAX_VALUE superior, que puede hacer que justo antes de lanzar la excepción personalizada, mediante el uso de Sergej @ sugerencia. Si encima es un exceso y que no es necesario aislar el caso de desbordamiento, simplemente suprimir la excepción de la captura de él:

int result = 0; 
try { 
    result = Integer.parseInt(s); 
} catch (NumberFormatException e) { 
    // act accordingly 
} 
+0

Capturar y lanzar 'Excepción' es Mala Práctica. –

+0

@Stephen eso suena interesante. ¿Alguna explicación o referencia? – paislee

+0

@paislee Gracias. Supongo que solo quiero preguntar si NFE detecta desbordamiento, ya que Java Doc no lo mencionó. Pero saber cómo aislar el caso ayuda también. Sin embargo, me sorprende que el código fuente (no un tipo de estándar) sea el último recurso de información ... – yangsuli

0

moldeada Cadena valor a Long y comparar Long value con Integer.Max_value

String bigStrVal="3147483647";   
    Long val=Long.parseLong(bigStrVal); 
    if (val>Integer.MAX_VALUE){ 
     System.out.println("String value > Integer.Max_Value"); 
    }else 
     System.out.println("String value < Integer.Max_Value"); 
+0

Eso es lo que hice ... Pero creo que esta es una solución fea ... – yangsuli

+1

@yangsuli Envuélvala en una función y no tendrá que volver a mirarla. En mi humilde opinión esto es muy elegante ... excepto que Long también tiene MAX_VALUE, por lo que aún no se garantiza su análisis. – paislee

+0

@paislee Long.Max_Value exactamente por qué no es una solución ... Capturar una excepción me parece mucho más elegante aquí (por supuesto, si Java me permite hacerlo ...) – yangsuli

0

No necesita hacer nada.

Como los Javadoc para Integer.parseInt(str, radix) estados, un NumberFormatException se lanza si el valor representado por la cadena no es representable como un valor int; es decir, si su magnitud es demasiado grande. Esto se describe como un caso separado del caso en que str está mal formateado, por lo que está claro (para mí) que esto es lo que significa. (Y se puede confirmar esto leyendo el código fuente.)

+0

Se puede _describir_ como un caso separado, pero en la práctica no hay una forma inmediata de diferenciar los casos. El método arroja excepciones en 6 casos, y todas son excepciones idénticas. Ver el código 'src'. – paislee

+0

Pero el OP preguntó acerca de * detección * desbordamiento, no * distinguir * de otros problemas. El NFE * detecta * desbordamiento, y creo que eso es lo que realmente concierne al OP. –

Cuestiones relacionadas