2016-05-20 3 views
3

У меня возникла проблема при попытке выполнить инструкцию try-catch внутри do while loop.I попросить пользователя сначала ввести букву, а затем номер и если он правильно вводит номер программы. Если он вводит букву вместо номера, программа должна сказать «Произошла ошибка, пожалуйста, введите номер» и попросите пользователя ввести номер снова, но каждый раз, когда я набираю букву вместо номера, программа переходит в бесконечный цикл и не позволит мне вводить новое значение , И просто идет «Произошла ошибка, вы должны ввести номер» «Введите номер».Делать пока идет бесконечно с try catch

public class OmaBrisem { 

    public static void main(String[] args) { 
     Scanner tastatura = new Scanner(System.in); 
     boolean b = true; 
     int a = 0; 
     String r = ""; 
     System.out.println("Please enter a letter"); 
     r = tastatura.next(); 
     do { 
      try { 
       System.out.println("Please enter numerical value"); 
       a = tastatura.nextInt(); 
       b = true; 
      } catch (Exception e) { 
       System.out.println("An error occured you must enter number"); 
       b = false; 
      } 
     } while (!b); 

    } 

} 

ответ

6

Это ваша проблема. Если пользователь вводит не номер, где вы ожидаете номер, то ваш nextInt() вызовет исключение, но он не удалит письмо из входного потока!

Это означает, что, когда вы цикл обратно, чтобы получить число раз, письмо будет еще там и ваш nextInt() снова возбудит исключение. И так далее, до бесконечности (или, по крайней мере, до жары смерти Вселенной, или машина, наконец, ломается, в зависимости от того, что наступит раньше).

Один из способов исправить это будет на самом деле читать/пропускать следующий символ, когда nextInt() не работает, так что он удаляется из входного потока. Вы могли бы в основном сделать это с Scanner.findInLine("."), пока Scanner.hasNextInt() не вернется.

Следующий код показывает один из способов сделать это:

import java.util.Scanner; 
public class MyTestProg { 
    public static void main(String [] args) { 
     Scanner inputScanner = new Scanner(System.in); 
     System.out.print("Enter letter, number: "); 

     // Get character, handling newlines as needed 

     String str = inputScanner.findInLine("."); 
     while (str == null) { 
      str = inputScanner.nextLine(); 
      str = inputScanner.findInLine("."); 
     } 

     // Skip characters (incl. newline) until int available. 

     while (! inputScanner.hasNextInt()) { 
      String junk = inputScanner.findInLine("."); 
      if (junk == null) { 
       junk = inputScanner.nextLine(); 
      } 
      System.out.println("Ignoring '" + junk + "'"); 
     } 

     // Get integer and print both. 

     int num = inputScanner.nextInt(); 
     System.out.println("Got '" + str + "' and " + num); 
    } 
} 

А следующий транскрипт показывает его в действии:

Enter letter, number: Abcde42 
Ignoring 'b' 
Ignoring 'c' 
Ignoring 'd' 
Ignoring 'e' 
Got 'A' and 42 
+0

я вроде * до тепловой смерти вселенной, или машина, наконец, ломается, что наступит первым * –

+0

Когда вы вводите две буквы в то же время ваш код также не работает в бесконечное время цикла – HasS

+1

@HasS, да, когда есть промежуточная новая строка, которая заставляет 'findInLine' терпеть неудачу. - Я тестировал только одну строчку. Хотя код был предназначен только для примера, чтобы проиллюстрировать концепцию, я исправил обновление. Если есть * еще * проблема, сообщите мне точные данные теста, которые вы используете. – paxdiablo

0

Просто добавьте tastatura.nextLine() в catch блоке, чтобы отменить последний вход.

+0

Это неплохо, если вы с радостью отбросьте всю оставшуюся часть линии. Я предпочитаю более локализованный подход, но, предполагая, что вы даете понять о возможном эффекте, это будет работать. – paxdiablo

0

Вы можете выйти из цикла по break;, когда исключение ловится ... Так просто добавить:

  break; 

на свой улов Блок :)

Предложение улов будет выглядеть следующим образом:

catch (Exception e) { 
      System.out.println("An error occured you must enter number"); 
      b = false; 
      break; 
     } 
1

я понял, что моя программа игнорирует объект Scanner tastatura в Ьгу блоке всякий раз, когда я вставить неправильное значение и сделать в то время как цикл начинается снова, так что я создал новый OBJ ect класса Scanner и назвал его tastatura2, и моя программа отлично работает.

Scanner tastatura = new Scanner(System.in); 
     boolean b = true; 
     int a = 0; 
     String r = ""; 
     System.out.println("Please enter a letter"); 
     r = tastatura.next(); 
     do { 
      try { 
       Scanner tastatura2 = new Scanner(System.in); 
       System.out.println("Please enter numerical value"); 
       a = tastatura2.nextInt(); 
       b = true; 
      } catch (Exception e) { 
       System.out.println("An error occured you must enter number"); 
       b = false; 
      } 
     } while (!b); 
+0

Иногда использование только сканера для ввода приводит к ошибкам, которые случались со мной много раз – HasS