2013-11-28 4 views
0

В приведенном ниже коде, когда я вводил что-либо, кроме целочисленного значения, код не запрашивает мой ввод еще раз и просто выводит строки вывода бесконечно. Небольшая помощь ...Бесконечная петля; не понимаю, как

int choice = 0; 
    while(choice == 0) 
    { 
     try 
     { 
      System.out.println("Start by typing the choice number from above and hitting enter: "); 
      choice = input.nextInt(); 
     } 
     catch(Exception e) 
     { 

     } 

     if ((choice == 1) || (choice == 2) || (choice == 3)) 
     { 
      break; 
     } 
     else 
     { 
      System.out.println("Invalid choice number. Please carefully type correct option."); 
      choice = 0; 
     } 
    } 

ответ

0

Похоже, в строке choice = input.nextInt(); значение выбор всегда 0. Выбор печати вскоре после этого.

Также для не целочисленного значения добавьте условие для выхода из цикла.

2

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

Вы можете исправить это, вызвав метод skip с таким шаблоном, как [^0-9]*, чтобы пропустить все недопустимые данные. Тогда будет работать вход вроде «aaa3». Если вы хотите игнорировать все, используйте .* в качестве шаблона.

+1

Я получил Это. Я объявил строковый переменный ответ, который принимает значение input.next(). Затем я преобразовал его в int. В любом случае спасибо! – user3043624

3

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

Это позволит решить вашу проблему:

catch(Exception e) 
{ 
    input.nextLine(); // Consume the invalid line 
    System.out.println("Invalid choice number. Please carefully type correct option."); 
} 

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

1

Вы используете Scanner(system.in); из пакета import java.util.Scanner;? Попробуйте добавить input.nextLine(); в catch, чтобы очистить значение, чтобы остановить бесконечный цикл.

public static void main(String[] args) { 

int choice = 0; 
Scanner input = new Scanner(System.in); 

while(choice == 0) 
{ 
    try 
    { 
     System.out.println("Start by typing the choice number from above and hitting enter: "); 
     choice = input.nextInt(); 
    } 
    catch(Exception e) 
    { 
     input.nextLine(); 
     System.out.println("Invalid choice number. Please carefully type correct option."); 
    } 

    if ((choice == 1) || (choice == 2) || (choice == 3)) 
    { 
     break; 
    } 
    else 
    { 
     System.out.println("Invalid choice number. Please carefully type correct option."); 
     choice = 0; 
    } 
} 
} 
+0

Я думаю, что он уже использует 'Scanner (System.in)'. – keyser

+0

Ох. В чем проблема? Это отлично работает для меня ... Просто нужен дополнительный перерыв в улове ... – Reanimation

+0

Дополнительный перерыв? Я не уверен, что вы имеете в виду. Проблема заключается в бесконечном цикле для нецелого ввода. – keyser

1

Проблема в том, что вы не потребляете оставшиеся данные в потоке. Я решил его с помощью следующего кода, но вы хотите, чтобы документ, который вы закодировать лучше, прежде чем использовать его в программе:

int choice = 0; 
while(choice == 0) 
{ 
    try 
    { 
     System.out.print("Start by typing the choice number from above and hitting enter: "); 
     choice = input.nextInt(); 
    } 
    catch(Exception e) 
    { 
     input.next(); 
     System.out.println("Invalid choice number. Please carefully type correct option."); 
    } 

    if ((choice == 1) || (choice == 2) || (choice == 3)) 
    { 
     break; 
    } 
    choice = 0; 
} 
1

Вы можете упростить и уменьшить свой код следующим образом:

int choice; 
    System.out.println("Start by typing the choice number from above and hitting enter: "); 
    while(true) 
    { 
     try { 
      choice = input.nextInt(); 
      if ((choice == 1) || (choice == 2) || (choice == 3)) 
       break; 
     } catch(InputMismatchException e) { // handle only the specific exception 
      input.nextLine();    // clear the input 
     } 
    System.out.println("Invalid choice number. Please carefully type correct option."); 
    } 
Смежные вопросы