W3docs

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 — никаких truthy/falsy-значений, как в 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
}

Цена {} — два символа; цена ошибки — ваши выходные.

Boolean-выражения внутри if

Условие может быть чем угодно, что вычисляется в boolean:

if (x > 0 && x < 100) { ... }
if (name.equals("admin")) { ... }
if (!list.isEmpty()) { ... }
if (user != null && user.isActive()) { ... }

Обратите внимание, что if — это оператор, а не выражение: он выполняет действие, но сам не производит значения, поэтому нельзя написать int x = if (...). Для версии, производящей значение, используйте Тернарный оператор.

Последний паттерн — сначала проверка на null, затем вызов метода — использует ленивые вычисления (short-circuit evaluation). Если 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 предоставляет бесплатно.

Практический пример

Цепочка else if ниже конвертирует числовые оценки в буквенные. Запустите её и убедитесь в правильности вывода:

java— editable, runs on the server

Вывод:

95 -> A
82 -> B
71 -> C
68 -> D
45 -> F

Когда использовать switch

Длинная цепочка else if, проверяющая одну переменную по списку фиксированных значений, зачастую понятнее в виде оператора switch. Используйте if/else if, когда ветви проверяют разные выражения или диапазоны (как в примере с оценками выше); используйте switch, когда сравниваете одно значение с несколькими константами.

Что дальше

Для однострочного условного присваивания Тернарный оператор зачастую читается лучше, чем полный if/else.

Практика

Практика
Что выведет этот код, если score равно 85?
Что выведет этот код, если score равно 85?
Was this page helpful?