Java выполняет цикл while с несколькими условиями, которые не выполняются должным образом

#java #loops #do-while

#java #циклы #do-while

Вопрос:

Я должен написать программу Magic 8 ball, которая будет учитывать ошибки пользовательского ввода, и я должен использовать цикл для этого.

 boolean okay;
    do {
        System.out.printf("What is your question?n");
        questionStr = keyboard.nextLine();
        int length = questionStr.length();
        if (questionStr.length() == 0) {
            System.out.println("Not allowed.");
            okay = false;
        } else if (!(questionStr.charAt(length - 1) == '?')) {
            System.out.println("Add question mark.");
            okay = false;
        } else if (questionStr.length() > 60) {
            okay = false;
        }
        okay = true;
    } while (!okay);
  

Когда я запускаю код и превращаю его в пустую строку, он выводит «не разрешено», однако он по-прежнему выполняет остальную часть кода и не выполняет обратный цикл и не спрашивает «В чем ваш вопрос?» То же самое происходит с вопросительным знаком; он выводит «Добавить вопросительный знак», но не выполняет обратный цикл, как предполагалось. Если я задаю вопрос длиной более 60 символов, код все равно выполняется и не возвращается к циклу и продолжает спрашивать пользователя «Какой у вас вопрос?» пока код не станет меньше 60 символов. Я пытаюсь выяснить, что я здесь делаю не так.

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

1. Добавьте else перед okay = true; .

2. Элементарная отладка выявила бы проблему с установкой okay на true в любом случае в первую минуту. На самом деле это не онлайн-отладчик

3. Добро пожаловать в Stack Overflow! Похоже, вам нужно научиться использовать отладчик. Пожалуйста, помогите себе с некоторыми дополнительными методами отладки . Если после этого у вас все еще будут проблемы, пожалуйста, не стесняйтесь возвращаться с более подробной информацией.

Ответ №1:

Переместите okay = true; перед вашими if утверждениями, которые это отрицают,

 okay = true;
if (questionStr.length() == 0) {
    System.out.println("Not allowed.");
    okay = false;
} else if (!(questionStr.charAt(length - 1) == '?')) {
    System.out.println("Add question mark.");
    okay = false;
} else if (questionStr.length() > 60) {
    okay = false;
}
  

Как указано, вы безоговорочно устанавливаете okay значение true перед своим условием while (!okay); , и, таким образом, цикл всегда заканчивается.