Cómo convertir un String a int en Java
Convierte un string de Java a int con Integer.parseInt e Integer.valueOf, y gestiona NumberFormatException.
Convertir texto como "42" en el número 42 es una de las tareas más comunes en Java — aparece cada vez que lees argumentos de línea de comandos, analizas un valor de configuración o procesas entrada de formulario. El JDK te ofrece un par de herramientas de una sola línea para ello en la clase Integer, además de un modo de fallo claro cuando el texto no es un número válido. Este capítulo muestra los enfoques idiomáticos y cómo manejar los casos incorrectos.
Integer.parseInt — el int primitivo que normalmente necesitas
Integer.parseInt(String) es la herramienta principal. Lee el texto y devuelve un int primitivo:
int count = Integer.parseInt("42"); // 42
int neg = Integer.parseInt("-7"); // -7Se permite un + o - inicial, pero nada más: espacios alrededor, puntos decimales, guiones bajos o letras provocan un fallo. Si puede haber espacios en blanco, recórtalos primero con s.trim() (o s.strip() en Java 11+). También existe una sobrecarga que acepta un radix, de modo que Integer.parseInt("ff", 16) lee hexadecimal y devuelve 255.
Integer.valueOf — cuando necesitas un objeto Integer
Integer.valueOf(String) realiza el mismo análisis, pero devuelve un Integer (el envoltorio en caja) en lugar de un int primitivo. Úsalo cuando el valor va directamente a una colección como List<Integer> o en cualquier lugar donde se requiera una referencia a objeto. Como ventaja adicional, valueOf almacena en caché las instancias en caja para valores pequeños (−128 a 127), por lo que puede ser marginalmente más barato que parseInt seguido de autoboxing.
| Enfoque | Devuelve | Cuándo usarlo |
|---|---|---|
Integer.parseInt(s) | int primitivo | cuando quieres hacer aritmética de inmediato |
Integer.valueOf(s) | objeto Integer | cuando necesitas un envoltorio para una colección o genéricos |
Integer.parseInt(s, radix) | int primitivo | el texto está en base 2, 8, 16, etc. |
Manejo de entrada inválida con NumberFormatException
Ambos métodos lanzan una NumberFormatException sin comprobar cuando el string no es un entero analizable — "12x", "3.14", "" o null fallan todos. Como es sin comprobar, el compilador no te obligará a capturarla, por lo que depende de ti proteger las entradas que no controlas:
String raw = userInput();
try {
int value = Integer.parseInt(raw.trim());
// ... use value
} catch (NumberFormatException e) {
System.out.println("Not a whole number: " + raw);
}Cuando el análisis "se espera que falle a veces" y no quieres excepciones en tu flujo de control, envuélvelo en un ayudante que devuelva un OptionalInt en lugar de lanzar. Eso convierte un try/catch en una comprobación limpia de isPresent() en el sitio de llamada. Consulta Java Optional para el patrón más amplio, y Java try-catch para la mecánica de captura de la excepción.
Un ejemplo completo: todos los enfoques uno al lado del otro
Este programa ejecuta cada técnica de conversión y los dos casos de fallo, para que puedas ver exactamente qué devuelve o imprime cada uno:
Lo que se puede extraer de la ejecución:
Integer.parseInt("42")imprime42como unintprimitivo, eInteger.valueOf("42")imprime el mismo42— la diferencia es el tipo, un objeto frente a un primitivo, no el valor.- La sobrecarga de radix convierte
"ff"en255, lo que demuestra que el segundo argumento controla la base; sin radix, el predeterminado es 10. "12x"es rechazado conNumberFormatExceptioncuyo mensaje esFor input string: "12x"— la excepción nombra el texto exacto que falló, lo que la hace útil en los registros.- Pasar
nulllanzaNumberFormatException(mensajeCannot parse null string), noNullPointerException— por lo que una única captura deNumberFormatExceptioncubre tanto la entrada mal formada como la nula. - El ayudante
tryParserecorta" 7 "a7y devuelveabsentpara"nope", sin lanzar nunca — ese es el patrón a usar cuando la entrada inválida es normal en lugar de excepcional.
Práctica
Temas relacionados
- Cómo convertir un int a String en Java — la dirección inversa.
- Excepciones en Java — contexto sobre
NumberFormatExceptiony la familia de excepciones sin comprobar. - Tipos de datos en Java — la diferencia entre el primitivo
inty el envoltorioInteger.