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;
}