2013-12-19 4 views
0

Моя программа содержит несколько опций, которые пользователь может выбрать посредством ввода номера, который позволяет им выполнить определенную задачу. В настоящее время мой код настроен с if и else, если цикл завершает задачу, если имеется определенное количество входных данных. Однако в тот момент, когда программа заканчивается после одной задачи. Я хочу, чтобы пользователь мог ввести другой номер для выполнения другой задачи. Я попытался окружить код циклом while и выходом, чтобы позволить пользователю избежать цикла и завершить программу, но это не работает и приводит к «java.util.NoSuchElementException». Программа отлично работает без цикла while.JAVA: Создание цикла меню

Это пример текущего кода, который мы надеемся, передает то, что я имею в виду:

System.out.println("Enter one of the following commands:"); 
System.out.println("1 - something.."); 
System.out.println("2 - something else.."); 
System.out.println("3 - exit"); 
Scanner scanchoice = new Scanner(System.in); 
System.out.println(); 
System.out.println("Enter \"1\", \"2\" or \"3\""); 
int choiceentry = scanchoice.nextInt(); 

while (choiceentry != 3) { 

    if (choiceentry < 1 || choiceentry > 3) { 

     System.out.println("Enter \"1\", \"2\", \"3\" or \"4\""); 
     choiceentry = scanchoice.nextInt(); 

    } 

    else if(choiceentry == 1) { 
     // ..do something 
    } 
    else if(choiceentry == 2) { 
     //..something else 
    } 
    else if(choiceentry == 3) { 
     //...exit program 
    } 

} 

Так что я хочу, чтобы попасть в эту петлю, и единственный выход для завершения программы. Я надеюсь, что цикл while вернет пользователя в меню, позволяя выбрать другой вариант, однако это не работает. Что не так с этим кодом? И как я могу реализовать эту идею?

Заранее благодарен!

+1

Не лучше использовать переключатель? –

ответ

2

Используйте Scanner#hasNextInt() перед вызовом Scanner.nextInt() избавиться от NoSuchElementException

if(scanchoice.hasNextInt()) 
choiceentry = scanchoice.nextInt(); 

hasNextInt() возвращается истинным, только если следующая лексема является допустимым ИНТ

Вы можете сделать так

//set choiceentry to -1, this will make it to enter while loop 
    int choiceentry = -1 

    while(choiceentry < 1 || choiceentry > 3){ 

      System.out.println("Enter \"1\", \"2\", \"3\" or \"4\""); 
      if(scanchoice.hasNextInt()) 
      choiceentry = scanchoice.nextInt(); 

    } 

    switch(choiceentry){ 
     case 1: 
      //do logic 
      break; 
     case 2: 
      //do logic 
      break; 
     case 3: 
      //do logic 
      break; 
    } 

Я изменил его, чтобы использовать операторы switch, поскольку они удобны в получении входных данных

+0

Возможно, я ошибаюсь, но есть ли дополнительная привязка в этом коде: /? – user2941526

+0

ха-ха-ха, закрыл предыдущую открытую скобку (скрыто) .. Теперь удалил ее :) – Keerthivasan

2

Вы только задавая пользователю выбрать другой пункт меню, если выбор < 1 или > 3

вы должны установить этот код в else statement`:

while (choiceentry != 3) { 
    else if(choiceentry == 1) { 
     // ..do something 
    } 
    else if(choiceentry == 2) { 
     //..something else 
    } 
    else if(choiceentry == 3) { 
     //...exit program 
    } 
    else{ 

     System.out.println("Enter \"1\", \"2\", \"3\" or \"4\""); 
     choiceentry = scanchoice.nextInt(); 

    } 

} 
1

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

Как предложил г-н Пхи в комментариях, оператор switch будет лучшей альтернативой вашей текущей структуре if-else. Это сделает ваш чистящий код чистым, и случай по умолчанию довольно хорош для обнаружения неожиданных значений.

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

int choiceentry; 

do { 
    System.out.println("Enter \"1\", \"2\" or \"3\""); 
    choiceentry = scanchoice.nextInt(); 

    switch (choiceentry) 
    { 
     case 1: 
      // do something 
      break; 
     case 2: 
      // ..something else 
      break; 
     case 3: 
      // .. exit program 
      break; 
     default: 
      System.out.println("Choice must be a value between 1 and 3."); 
    } 
} while (choiceentry != 3); 
+0

Я попытался реализовать ваше предложение, но продолжаю получать «Исключение в потоке» основного «java.util.NoSuchElementException» на утверждение «choiceentry = scanchoice.nextInt();» в начальной части цикла do – user2941526

+0

Это работает для меня, но я не совсем уверен, как и почему. Возможно, вам потребуется связать вызов 'nextInt()' в if-statement, как предложено [здесь] (http://stackoverflow.com/a/20681686/2580649).Не забудьте инициализировать 'choiceentry' где-то перед коммутатором. – PakkuDon

+0

ОК, поэтому код должен работать сейчас, за исключением того, что я получаю бесконечный цикл для случая, я не думаю, что оператор break возвращает меня к точке, где я могу ввести новое значение для выполнения следующего «выбора». EDIT: после просмотра цикла программа проходит, разрыв работает, и он печатает «Enter» 1 »,« 2 »или« 3 », но он просто принимает значение старого выбора и продолжает и не разрешает запись нового. – user2941526

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