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
}
http://stackoverflow.com/questions/8030485/java-integer-parseint-failed- to-parse-a-string –
@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
'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'. –