try/catch con InputMismatchException crea un bucle infinito [duplicado]

Resuelto limp_chimp asked hace 12 años • 7 respuestas

Así que estoy creando un programa que toma entradas de la entrada del usuario. Tengo lo que parece ser un bloque try/catch muy sencillo que, si el usuario no ingresa un int, debe repetir el bloque hasta que lo haga. Aquí está la parte relevante del código:

import java.util.InputMismatchException;
import java.util.Scanner;


public class Except {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        boolean bError = true;
        int n1 = 0, n2 = 0, nQuotient = 0;

        do {
            try {
                System.out.println("Enter first num: ");
                n1 = input.nextInt();
                System.out.println("Enter second num: ");
                n2 = input.nextInt();
                nQuotient = n1/n2;
                bError = false;
            } 
            catch (Exception e) {
                System.out.println("Error!");
            }
        } while (bError);

        System.out.printf("%d/%d = %d",n1,n2, nQuotient);
    }
}

Si ingreso un 0 para el segundo número entero, entonces try/catch hace exactamente lo que se supone que debe hacer y me obliga a ingresarlo nuevamente. Pero, si tengo una excepción InputMismatchException, como ingresar 5.5 para uno de los números, simplemente muestra mi mensaje de error en un bucle infinito. ¿Por qué sucede esto y qué puedo hacer al respecto? (Por cierto, intenté escribir explícitamente InputMismatchException como argumento para detectar, pero no solucionó el problema.

limp_chimp avatar Oct 03 '12 11:10 limp_chimp
Aceptado

Debes llamar next();cuando recibas el error. También es recomendable utilizarhasNextInt()

       catch (Exception e) {
            System.out.println("Error!");
           input.next();// Move to next other wise exception
        }

Antes de leer el valor entero, debe asegurarse de que el escáner tenga uno. Y no necesitará un manejo de excepciones como ese.

    Scanner scanner = new Scanner(System.in);
    int n1 = 0, n2 = 0;
    boolean bError = true;
    while (bError) {
        if (scanner.hasNextInt())
            n1 = scanner.nextInt();
        else {
            scanner.next();
            continue;
        }
        if (scanner.hasNextInt())
            n2 = scanner.nextInt();
        else {
            scanner.next();
            continue;
        }
        bError = false;
    }
    System.out.println(n1);
    System.out.println(n2);

Javadoc del escáner

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.

Amit Deshpande avatar Oct 03 '2012 04:10 Amit Deshpande

También puedes probar lo siguiente

   do {
        try {
            System.out.println("Enter first num: ");
            n1 = Integer.parseInt(input.next());

            System.out.println("Enter second num: ");
            n2 = Integer.parseInt(input.next());

            nQuotient = n1/n2;

            bError = false;
        } 
        catch (Exception e) {
            System.out.println("Error!");
            input.reset();
        }
    } while (bError);
Debobroto Das avatar Oct 03 '2012 05:10 Debobroto Das

Para seguir la respuesta de debobroto das también puedes poner después

input.reset();
input.next(); 

Tuve el mismo problema y cuando probé esto. Lo arregló por completo.

YoMama420 avatar Nov 19 '2016 19:11 YoMama420

otra opción es definir Scanner input = new Scanner(System.in); dentro del bloque try, esto creará un nuevo objeto cada vez que necesite volver a ingresar los valores.

ron17ro avatar Jul 29 '2014 11:07 ron17ro