Вопрос-ответ

try/catch with InputMismatchException creates infinite loop [duplicate]

try / catch with InputMismatchException создает бесконечный цикл

Итак, я создаю программу, которая принимает целые числа из пользовательского ввода. У меня есть то, что кажется очень простым блоком try / catch, который, если пользователь не вводит int, должен повторять блок, пока он не введет. Вот соответствующая часть кода:

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

Если я ввожу 0 для второго целого числа, то try / catch делает именно то, что должен, и заставляет меня ввести его снова. Но, если у меня возникает исключение InputMismatchException, например, при вводе 5.5 для одного из чисел, оно просто показывает мое сообщение об ошибке в бесконечном цикле. Почему это происходит, и что я могу с этим поделать? (Кстати, я пытался явно ввести исключение InputMismatchException в качестве аргумента для catch, но это не решило проблему.

Переведено автоматически
Ответ 1

Вам нужно вызвать next(); при получении ошибки. Также рекомендуется использовать hasNextInt()

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

Перед чтением целочисленного значения вам нужно убедиться, что оно есть в scanner. И вам не понадобится подобная обработка исключений.

    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 из сканера


Когда сканер выдает исключение InputMismatchException, сканер не передает токен, вызвавший исключение, так что его можно извлечь или пропустить каким-либо другим методом.


Ответ 2

Вы также можете попробовать следующее

   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);
Ответ 3

Чтобы следовать ответу debobroto das, вы также можете поставить после

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

У меня была такая же проблема, и когда я попробовал это. Это полностью исправило ее.

Ответ 4

другой вариант - определить Scanner input = новый сканер (System.in); внутри блока try это будет создавать новый объект каждый раз, когда вам нужно повторно вводить значения.

java exception