2016-05-18 3 views
1

Я столкнулся java.util.InputMismatchException;inputmismatchexception: ввод в бесконечный цикл?

Я ловлю InputMismatchException, но я не понимаю, почему это происходит в бесконечный цикл после приема первого неправильный вход и выход идет как это:

enter two integers 
exception caught 

это идет на повторение

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    int flag = 0; 
    while (flag != 1) { 
     try { 
      System.out.println("enter two integers"); 
      int a = sc.nextInt(); 
      int b = sc.nextInt(); 
      int result = a + b; 
      flag = 1; 
      System.out.println("ans is" + result); 
     } catch (NumberFormatException e) { 
      System.out.println("exception caught"); 
     } catch (InputMismatchException e) { 
      System.out.println("exception caught"); 
     } 
    } 
} 

ответ

0

Если нажать клавишу ввода вы должны потреблять этот персонаж слишком

int a = sc.nextInt(); 
int b = sc.nextInt(); 
sc.nextLine(); 

, то вы можете ввести

2 3 <CR> 
+0

@Berger Да, я не уверен, совсем как ОП хочет ввести свои данные. –

0

В своем коде вы улавливаете InputMisMatchException, и вы просто печатая сообщение, которое приведет снова идти к вашему циклу.

 int a = sc.nextInt(); 
     int b = sc.nextInt(); 

Когда любой из этих линий бросить исключение ваш flag=1 не будет установлен, и вы будете в бесконечном цикле. Исправьте обработку исключений и выйдете из цикла или очистите ввод сканера, прочитав его как строку.

0

Необходимо удалить буфер, чтобы он не был недопустимым для nextInt() после исключения. Добавьте finally блок и вызвать sc.nextLine() внутри него:

while (flag != 1) { 
    try { 
     System.out.println("enter two integers"); 
     int a = sc.nextInt(); 
     int b = sc.nextInt(); 
     int result = a + b; 
     flag = 1; 
     System.out.println("ans is" + result); 

    } catch (NumberFormatException e) { 
     System.out.println("exception caught"); 
    } catch (InputMismatchException e) { 
     System.out.println("exception caught"); 
    } finally { //Add this here 
     sc.nextLine(); 
    } 
} 

Рабочий пример: https://ideone.com/57KtFw

+0

Хотя это будет работать для данных типа '1 2', оно будет терпеть неудачу для данных типа' 1 2 3', потому что 'nextLine()' помещается в 'finally', что означает, что он будет потреблять целую строку *, даже если исключение не будет выбрано * поэтому он также будет использовать '3', который может быть действительным для последующей части приложения. Лучше обрабатывать каждое исключение в блоке catch, раздел 'finally' предназначен для обязательных задач, которые должны выполняться независимо от того, будет ли выбрано исключение. – Pshemo

Смежные вопросы