Java: if, else и else if
Ветвите поток программы в Java с помощью операторов if, else if и else и научитесь аккуратно вкладывать условия.
Программа, которая всегда выполняет одну и ту же последовательность инструкций, не очень полезна. if — это то, как Java задаёт вопрос и выбирает, что делать дальше. Вместе с else if и else он образует костяк каждого решения, которое когда-либо примет ваш код.
Базовый if
if (condition) {
// runs only when condition is true
}Условие должно быть выражением типа boolean — никаких «истиноподобных»/«ложноподобных» значений, как в JavaScript или Python. if (1) не компилируется; if (count > 0) компилируется.
int age = 20;
if (age >= 18) {
System.out.println("You can vote.");
}Добавление else
else предоставляет альтернативную ветвь — то, что выполняется, когда условие false:
int age = 16;
if (age >= 18) {
System.out.println("You can vote.");
} else {
System.out.println("Too young to vote.");
}Выполняется ровно одна из двух ветвей. Никакого «проваливания» нет.
Цепочка с else if
Для более чем двух исходов выстраивайте цепочку else if. Java проверяет каждое условие сверху вниз и выполняет первую ветвь, чьё условие истинно; остальные пропускаются:
int score = 72;
if (score >= 90) {
System.out.println("A");
} else if (score >= 80) {
System.out.println("B");
} else if (score >= 70) {
System.out.println("C");
} else {
System.out.println("F");
}Порядок важен. Если поставить самое нестрогое условие первым, оно поглотит каждый последующий случай. Пример выше печатает C, потому что score >= 70 — первое совпадение, хотя score >= 60 тоже было бы истинно, если бы проверялось.
Скобки необязательны — но используйте их
Java позволяет опускать скобки, когда ветвь состоит из одной инструкции:
if (loggedIn)
showDashboard();
else
showLogin();Не делайте так. Всегда используйте скобки. Две строки ниже выглядят одинаково, но ведут себя по-разному:
if (loggedIn)
showDashboard();
logActivity(); // ALWAYS runs — not part of the if!
if (loggedIn) {
showDashboard();
logActivity(); // both inside the if
}Цена {} — два символа; цена ошибки — ваши выходные.
Булевы выражения внутри if
Условием может быть всё, что вычисляется в boolean:
if (x > 0 && x < 100) { ... }
if (name.equals("admin")) { ... }
if (!list.isEmpty()) { ... }
if (user != null && user.isActive()) { ... }Последний шаблон — сначала проверка на null, затем вызов метода — использует короткозамкнутое вычисление. Если user равен null, user.isActive() никогда не вызывается. См. Логические операторы.
Вложенные операторы if
Вы можете поместить if внутрь другого if. Иногда это самый ясный способ выразить условие:
if (user != null) {
if (user.isAdmin()) {
System.out.println("Welcome, admin.");
} else {
System.out.println("Welcome, user.");
}
} else {
System.out.println("Please log in.");
}Но глубокая вложенность читается плохо. Ранние возвраты обычно её упрощают:
if (user == null) {
System.out.println("Please log in.");
return;
}
if (user.isAdmin()) {
System.out.println("Welcome, admin.");
return;
}
System.out.println("Welcome, user.");Меньше отступов, легче следить.
Частая ошибка: = вместо ==
Новички, пришедшие из других языков, иногда пишут:
if (x = 5) { ... } // compile error= — это присваивание, == — сравнение. В отличие от C, Java отклоняет это на этапе компиляции, если только переменная не boolean — потому что результат int x = 5 — это int, а не boolean. Это маленькая милость, которую система типов Java дарит вам бесплатно.
Разобранный пример
Что дальше
Для однострочных условных присваиваний тернарный оператор часто читается лучше, чем полный if/else.
Practice
What is printed by this code when score is 85?