Do-while оператор Java

Я новичок в программировании. У меня есть трудности с пониманием этого кода:

public static boolean onCampus(String name)
{
    boolean invalidResponse = true;
    do{
    System.out.println("Is "+name+ " living on campus? (yes/no)");
    String response = in.nextLine();
    if(response.equalsIgnoreCase("yes"))
        return true;
    else if (response.equalsIgnoreCase("no"))
        return false;
    else
        System.out.println("Invalid response.");
    } while(invalidResponse);
    return false;
}

Что я не понимаю, это где invalidResponse назначенный false если пользователь введет приемлемый ответ? И что это в прошлом return false;? Почему это после заявления do-while?

3 ответа

Решение

Это своего рода анти-паттерн - цикл бесконечен и никогда не завершится "должным образом". Вместо этого, как только вы получите правильный ответ, вы просто позвоните returnи выйдите из метода, тем самым завершив цикл.

return false после цикла есть ограничение компиляции. В Java, если метод возвращает значение, каждая мыслимая ветвь должна содержать return заявление (или throw заявление, если быть точным). Во время компиляции Java не "знает", что цикл никогда не может быть прерван, поэтому он заставляет вас иметь оператор return в этой ветви (т. Е. Предполагается, что цикл завершается без if или же else if выполняются ветки).

Последнее "верни ложь"; просто так, чтобы компилятор не жаловался, это недостижимый код. Поскольку ваш тип возвращаемого значения логический, ваш код должен возвращать true или false для всех случаев. "invalidResponse" никогда не присваивается false, поэтому ваш цикл будет выполняться бесконечно, пока пользователь не введет либо да, либо нет, и в этом случае он вернет логическое значение и выйдет из функции.

Если предположить, in представляет собой статический Scanner переменная.

Цикл намеренно бесконечен; invalidResponse никогда не будет установлен false,

Вместо этого return линии являются выходом из цикла, принимая значение "yes" или же "no" введен

Финал return false; необходим для целей компиляции, но никогда не будет достигнут.

Примечательно, однако, что я поклонник одного returnиспользование констант в качестве первой половины равенства и удаление чувствительности к регистру один раз, и это будет перекодировано следующим образом:

public static boolean onCampus(String name) {

    boolean response = false;

    do {

        System.out.println("Is " + name + " living on campus? (yes/no)");
        String input = in.nextLine().toLowerCase();
        response = "yes".equals(input);

        if (response || "no".equals(input)) {

            break;  // exit the loop

        } else {

            System.out.println("Invalid response.");
        }

    } while (!response);

    return response;
}
Другие вопросы по тегам