Cómo manejar el bucle infinito causado por una entrada no válida (InputMismatchException) usando el escáner
Entonces, me quedo atascado con este fragmento de código:
import java.util.InputMismatchException;
import java.util.Scanner;
public class ConsoleReader {
Scanner reader;
public ConsoleReader() {
reader = new Scanner(System.in);
//reader.useDelimiter(System.getProperty("line.separator"));
}
public int readInt(String msg) {
int num = 0;
boolean loop = true;
while (loop) {
try {
System.out.println(msg);
num = reader.nextInt();
loop = false;
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
}
}
return num;
}
}
y aquí está mi salida:
Inserte un número entero: ¡
Valor no válido!
Inserte un número entero: ¡
Valor no válido!
...
Según el javadoc para Scanner:
Cuando un escáner genera una excepción InputMismatchException, el escáner no pasará el token que causó la excepción, por lo que se puede recuperar u omitir mediante algún otro método.
Eso significa que si el siguiente token no es un int
, arroja el InputMismatchException
, pero el token permanece allí. Entonces, en la siguiente iteración del ciclo, reader.nextInt()
lee el mismo token nuevamente y lanza la excepción nuevamente. Lo que necesitas es gastarlo. Agregue un reader.next()
dentro de su catch
para consumir el token, que no es válido y debe descartarse.
...
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
reader.next(); // this consumes the invalid token
}