try/catch con InputMismatchException crea un bucle infinito [duplicado]
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.
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.
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);
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.
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.