Soy bastante nuevo en Java y estoy haciendo un cuestionario de personalidad de Java para mi curso. Estoy creando una función que busca una respuesta para un número entero entre 0-5 (inclusive), usando el escáner, y si la respuesta no es válida, la rehago de forma recursiva. Usé un try / catch en caso de que no hubiera int, sin embargo, al ejecutarlo y escribir un no número, se repite para siempre. Estoy bastante seguro de que esta recursividad no funciona, pero ¿alguien podría ayudarme a encontrar lo que está mal en este código?

public static int checkAnswer(String question, Scanner scan) {
        try {
            int toCheck = scan.nextInt();
            scan.nextLine();
            if(toCheck<=5 && toCheck >=0) {
                return toCheck;
            }else {
                System.out.println("No, write a number from 0-5");
                System.out.println(question);
                return checkAnswer(question, scan);
            }
        } catch(InputMismatchException exception) {
            System.out.println("No, not a line, a number, please");
            System.out.println(question);
            return checkAnswer(question, scan);
        }
    }
2
Chris George 18 oct. 2019 a las 19:42

1 respuesta

La mejor respuesta

Cuando el Scanner arroja un InputMismatchException, debe limpiar la línea porque no se leyó correctamente. Entonces, necesitas esto:

public static int checkAnswer(String question, Scanner scan) {
    try {
        int toCheck = scan.nextInt();
        scan.nextLine();
        if(toCheck<=5 && toCheck >=0) {
            return toCheck;
        }else {
            System.out.println("No, write a number from 0-5");
            System.out.println(question);
            return checkAnswer(question, scan);
        }
    } catch(InputMismatchException exception) {
        System.out.println("No, not a line, a number, please");
        System.out.println(question);
        scan.nextLine();
        return checkAnswer(question, scan);
    }
}

Mira que agregué un scan.nextLine(); en el bloque catch.

2
Villat 18 oct. 2019 a las 16:48