#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:
как я вижу, ваша программа ошибочна.
- if-else должен находиться внутри другого цикла while (например, бесконечного цикла или выхода в случае
again ==n
). так что каждый раз, когда вы вводите элемент scanner.next(), будет выполняться логика воспроизведения. - цикл 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");
}
}
}