Cómo manejar el bucle infinito causado por una entrada no válida (InputMismatchException) usando el escáner

Resuelto mateusmaso asked hace 14 años • 5 respuestas

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!
...

mateusmaso avatar Aug 26 '10 11:08 mateusmaso
Aceptado

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 catchpara 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
} 
samitgaur avatar Aug 26 '2010 05:08 samitgaur