2016-10-21 6 views
0

Мой код ниже циклически повторяется дважды. 1-й цикл while перед запросом пользователя (сделать выбор). Я сделал это проще, поставив выбор по умолчанию - «N».Пока цикл повторяется дважды после ввода пользователем

Таким образом, он попадает в оператор if и начинает цикл while while. Теперь он запрашивает у пользователя другой выбор. Пользователь может вводить только «А», поскольку все остальное будет ловушкой ошибки. Пользователь вводит «A» и получает запрос на добавление номера (переменная num = 0). Пользователь вводит номер.

Оператор if закрывается, а второй цикл while возвращается к началу, только он не останавливается, когда пользователю предлагается выбрать. Вместо этого он продолжается через цикл, называет оператор else, затем снова возвращается к началу второго цикла while и представляет пользователю запрос на выбор.

Код Обновлены Дополнительная информация

while (true) {    // 1st while loop 
choice="N"; 
    if (choice.equalsIgnoreCase("N")) { 
     while (true) {      // 2nd while loop 
      System.out.println("|-|-| Add Number [A] Go Back [B]"); 
      System.out.println("NUMBER: "+num); 
      System.out.print("Choice: "); 
      choice = c.nextLine(); 

      if (choice.equalsIgnoreCase("A")){ 
      System.out.print("Add: "); 
      num = (c.nextInt() + num); 
      System.out.println(""); 
      } 
      else if (choice.equalsIgnoreCase("B")){ 
      break; 
      } 
      else { 
      System.out.println("ERROR 19: Invalid response"); 
      System.out.println(""); 
      } 
     } 
    } 
} 

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

+3

У вас есть два «навсегда» петли и нет 'break' или' return' заявления, так как вы ожидаете, либо цикл до * когда-либо * конец? – Andreas

+0

вы не должны иметь свой основной цикл while (true), и в настоящее время у вас нет перерывов или чего-то другого, чтобы вы могли получить наш цикл, чтобы либо добавить разрыв; когда вы закончите или переменная boolean установлена ​​в true в начале и когда вы закончите, установите для переменной boolean значение false –

+2

_it не останавливается, когда пользователю предлагается выбор. Эта проблема связана с использованием 'nextInt' метод. Таким образом, этот квест является дубликатом [Сканер пропускает nextLine() после использования next(), nextInt() или других методов nextFoo()] (http: // stackoverflow.ком/вопросы/13102045/сканер-это-пропуск-nextline-после использования, следующего nextint или-другой-nextfoo). – Ravikumar

ответ

0

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

+0

Проверьте обновленный код. Я изначально отказался от этой части, чтобы сделать мой код более понятным. Я добавил его сейчас. – user3735534

0

Добавить break заявление в обоих if и else заявление:

  if (choice.equalsIgnoreCase("A")){ 
      System.out.print("Add: "); 
      num = (c.nextInt() + num); 
      System.out.println(""); 
      break; 

      } 
      else { 
      System.out.println("ERROR 19: Invalid response"); 
      System.out.println(""); 
      break; 
      } 
+0

Я включил перерыв. Это не то место, где я хотел, чтобы это было, так как я хочу, чтобы пользователь снова был запрошен для числа (пока они не войдут в «B», чтобы вернуться). Проверьте мой обновленный код. – user3735534

0

Я думаю, вы должны изменить свой цикл. Я предлагаю петлю так:

boolean finished = false; 
while(!finished) { 
    ... 
    choice = c.nextLine(); 
    if (choice.equalsIgnoreCase("A")){ 
     System.out.print("Add: "); 
     num = (c.nextInt() + num); 
     System.out.println(""); 
    } else if (choice.equalsIgnoreCase("Exit")) { //You can change this whatever you want 
     finished = true; 
    } else if (...){ 
     ... //another choice 
    } 
    else { 
     System.out.println("ERROR 19: Invalid response"); 
     System.out.println(""); 
    } 
} 
0

Сканер # nextLine потребляет полную линию (отсюда «следующая строка») из пользовательского ввода. Вот почему вы никогда не получаете повторяющийся цикл при использовании nextLine. Сканер # nextInt этого не делает, а символ последнего символа новой строки используется в следующий раз, когда вызывается Scanner # nextInt.

Чтобы ответить на мой вопрос:

if (choice.equalsIgnoreCase("A")){ 
     System.out.print("Add: "); 
     num = (c.nextInt() + num); //Prompts user for input (number) 
     c.nextLine();   // Consumes the last newline character 
     System.out.println(""); 
     } 
     else if (choice.equalsIgnoreCase("B")){ 
     break; 
     } 
     else { 
     System.out.println("ERROR 19: Invalid response"); 
     System.out.println(""); 

int option = input.nextInt(); 
input.nextLine(); // Consume newline left-over 
String str1 = input.nextLine(); 

Как ответил здесь: Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

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