Цикл While «игнорирует» ввод?

#java #while-loop

#java #цикл while

Вопрос:

Хорошо, итак, вот мой код:

 public static void playAgain(Scanner in){
    System.out.print("Play again?: ");
    String again=in.next();
    if (again.equalsIgnoreCase("y")){
        playerScore=0;
        aiScore=0;
        playAgain=true;
        }
    else if (again.equalsIgnoreCase("n")){
        playAgain=false;
        }
    else {
        while (!again.equalsIgnoreCase("y") amp;amp; !again.equalsIgnoreCase("n")){
            System.out.print("Invalid response.  Please enter "y" or "n": ");
            again=in.next();
            }
        }
    }
 

По какой-то причине, если я ввожу неправильную переменную, скажем, «boog», цикл while выводит сообщение об ошибке, но по какой-то причине по умолчанию используется значение «y», даже если я ввожу «n» — например, пример запуска будет:

Воспроизвести снова? boog

Неверный ввод, пожалуйста, введите y или n. n

-программа воспроизводится снова, несмотря на мой ввод n-

Как мне это исправить? Это что-то с порядком? Заранее спасибо!

Комментарии:

1. Ваш код говорит Invalid response , но ваш экранный протокол говорит Invalid input . Это не соответствует. Кроме того, я бы создал метод return playAgain напрямую, а не сохранял его в переменной поля. Чем меньше полей у вас в классе, тем проще его понять.

2. Я отредактировал свой ответ, если вам нужна альтернатива вашей текущей структуре вещей.

Ответ №1:

Я предполагаю, что вы используете какую-то глобальную переменную playAgain , чтобы указать, следует ли воспроизводить снова. Я бы вернул a boolean из функции, но в любом случае я не вижу playAgain изменений в последнем else блоке:

  else {
        while (!again.equalsIgnoreCase("y") amp;amp; !again.equalsIgnoreCase("n")){
            System.out.print("Invalid response.  Please enter "y" or "n": ");
            again=in.next();
            }
        }
 

Возможно, вам нужен весь набор if s в while цикле, поэтому again он будет обработан после того, как он будет содержать «y» или «n»? В любом случае структура функции нуждается в переосмыслении.

РЕДАКТИРОВАТЬ: мой подход был бы чем-то вроде:

 public static boolean playAgain(Scanner in){
   System.out.print("Play again?: ");
   String again=in.next();

   while (!again.equalsIgnoreCase("y") amp;amp; !again.equalsIgnoreCase("n")) {
      System.out.print("Invalid response.  Please enter "y" or "n": ");
      again = in.next();
   }

   if (again.equalsIgnoreCase("y")){
      playerScore = 0;
      aiScore = 0;
      return true;
   }

   // there are only two valid options, so to get here it must be "n"
   return false;
}
 

Комментарии:

1. У меня была похожая проблема, и я нашел это через Google. Спасибо @AusCBloke. 1

Ответ №2:

Это может быть связано с тем, что вы не устанавливаете playAgain значение false после выхода из цикла while. Является ли предыдущее значение playAgain true ?

Я думаю, вам нужно подумать о рефакторинге, чтобы цикл while находился над операторами «y» и «n» if / else . Таким образом if , / else всегда вызывается, как только пользователь ввел допустимое значение. Проверка должна быть в начале метода.

Ответ №3:

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

Ответ №4:

как я вижу, ваша программа ошибочна.

  1. if-else должен находиться внутри другого цикла while (например, бесконечного цикла или выхода в случае again ==n ). так что каждый раз, когда вы вводите элемент scanner.next(), будет выполняться логика воспроизведения.
  2. цикл while здесь выполнил код и работает нормально, поскольку вы не получили предупреждение «Неверный ввод, пожалуйста, введите y или n». снова.

итак, значение again было «n» и, следовательно, логика вышла из вашего цикла while. поэтому проверьте playAgain , установлен ли он как true

Ответ №5:

Плохой поток. Вы должны сделать что-то вроде этого (извините за любые ошибки, это было кропотливо напечатано на моем телефоне :

 public static void playAgain(Scanner in){
   System.out.print("Play again?: ");
      while (true) {
         String again=in.next();
         if (again.equalsIgnoreCase("y")){
            playerScore=0;
            aiScore=0;
            playAgain=true;
                break; 
         } else if (again.equalsIgnoreCase("n")){
            playAgain=false;
            break;
         } else {
            // bad input, so allow to loop again
            System.out.print("Invalid input! Please enter y or n");
         } 
      }
}