try / catch con InputMismatchException crea bucle infinito

Así que estoy construyendo un progtwig que toma datos de la entrada del usuario. Tengo lo que parece ser un bloque try / catch muy sencillo que, si el usuario no ingresa un int, debería 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 entero, entonces el try / catch hace exactamente lo que se supone que debe hacer y me hace volver a ponerlo. Pero, si tengo una InputMismatchException como al ingresar 5.5 para uno de los números, simplemente muestra mi mensaje de error en un bucle infinito. ¿Por qué está sucediendo esto y qué puedo hacer al respecto? (Por cierto, he intentado escribir explícitamente InputMismatchException como el argumento para atrapar, pero no solucionó el problema.

Debe llamar a next(); cuando recibes el error También es aconsejable usar hasNextInt()

  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ás un manejo de excepción así.

  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 de Escáner

Cuando un escáner arroja una excepción InputMismatchException, el escáner no pasará el token que causó la excepción, por lo que puede ser recuperado o salteado a través de algún otro método.

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); 

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

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

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

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

Como la statement bError = false nunca se alcanza en el try block , y la instrucción se golpea con la entrada tomada , sigue imprimiendo el error en bucle infinito .

Intenta usarlo de esta manera usando hasNextInt()

 catch (Exception e) { System.out.println("Error!"); input.hasNextInt(); } 

O intente utilizar nextLine() junto con Integer.parseInt() para tomar la entrada ….

 Scanner scan = new Scanner(System.in); int num1 = Integer.parseInt(scan.nextLine()); int num2 = Integer.parseInt(scan.nextLine()); 

Para complementar la respuesta AmitD:

Simplemente copie / pegue su progtwig y tenga esta salida:

 Error! Enter first num: .... infinite times .... 

Como puede ver, la instrucción:

 n1 = input.nextInt(); 

Está lanzando continuamente la excepción cuando se ingresa su número doble, y eso se debe a que su transmisión no se borra. Para solucionarlo, sigue la respuesta AmitD.

@Limp, tu respuesta es correcta, solo usa .nextLine () mientras lees la entrada. Código de muestra:

  do { try { System.out.println("Enter first num: "); n1 = Integer.parseInt(input.nextLine()); System.out.println("Enter second num: "); n2 = Integer.parseInt(input.nextLine()); nQuotient = n1 / n2; bError = false; } catch (Exception e) { System.out.println("Error!"); } } while (bError); System.out.printf("%d/%d = %d", n1, n2, nQuotient); 

Lea la descripción de por qué se produjo este problema en el siguiente enlace. Busque la respuesta que publiqué para el detalle en este hilo. Problema de entrada del usuario de Java Homework

Ok, lo describiré brevemente. Cuando lee una entrada usando nextInt (), solo lee la parte numérica pero el carácter ENDLINE todavía estaba en la transmisión. Esa fue la causa principal. Ahora mira el código de arriba, todo lo que hice fue leer toda la línea y analizarla, aún arroja la excepción y funciona de la manera en que esperabas que funcionara. El rest de tu código funciona bien.