Принятие решений с помощью if
Программы должны реагировать на данные: сдал или провалил, в наличии или распродано, корректно или нет. Оператор if — это то, как Java выбирает, какой код выполнить, исходя из условия.
if принимает булево условие в скобках и выполняет блок в фигурных скобках только тогда, когда это условие равно true:
Условие score >= 60 равно true, поэтому сообщение печатается. Строка после закрывающей скобки выполняется всегда — она вне if. Измени score на 40, и строка «passed» будет полностью пропущена.
В отличие от C, Java не позволит поставить число там, где ожидается булево значение. if (score) — это ошибка компиляции: условие должно быть настоящим выражением boolean, построенным из сравнений (>, >=, ==, !=) или булевой логики (&&, ||, !).
Добавление else
else даёт тебе путь «иначе» — код, который выполняется только тогда, когда условие равно false:
Выполняется ровно один из двух блоков — никогда оба, никогда ни одного. У else нет собственного условия; он просто перехватывает всё, что не охватил if.
Цепочки с else if
Когда исходов больше двух, объединяй условия в цепочку через else if. Java проверяет их сверху вниз и выполняет первый блок, чьё условие истинно, а остальные пропускает:
Порядок важен. Поскольку 84 сначала проверяется на >= 90 (ложь), затем на >= 80 (истина), он останавливается на B и даже не проверяет нижние границы. Именно поэтому тебе не нужно писать score >= 80 && score < 90: достижение второй ветви уже гарантирует, что score был меньше 90. Ставь самое узкое или самое приоритетное условие первым.
Завершающий else — это твой случай «по умолчанию». Опустить его здесь было бы ошибкой компиляции, так как grade мог бы остаться без присвоенного значения к моменту вывода.
Сравнение значений: == против equals()
Самая частая ошибка в if в Java — сравнение строк через ==. Для примитивов (int, double, char, boolean) == корректно. Для объектов == спрашивает «это один и тот же объект в памяти?», тогда как .equals() спрашивает «у них одинаковое содержимое?» — и почти всегда тебе нужно последнее:
Печатается только второе сообщение. new String("yes") — это объект, отличный от литерала "yes", поэтому == равно false, но текст идентичен, поэтому .equals() равно true. Правило большого пальца: для примитивов используй ==, для объектов используй .equals().
Безопасный приём, чтобы избежать NullPointerException, когда переменная может быть null: ставь литерал первым — if ("yes".equals(input)) — поскольку литерал никогда не бывает null.
Объединение и вложение условий
Ты можешь объединять условия с помощью && (и), || (или) и ! (не) или вкладывать один if в другой, когда проверка имеет смысл только после прохождения предыдущей:
&& и || вычисляются с коротким замыканием: в a && b, если a ложно, Java никогда не вычисляет b. Это удобно для защиты от ошибок: if (s != null && s.length() > 0) безопасно, потому что проверка длины пропускается, когда s равно null. По возможности предпочитай объединение через && глубокой вложенности; плоский код читается яснее, чем пирамида из скобок.
Классическая ловушка: один = — это присваивание, == — сравнение. Написать if (x = 5) — ошибка компиляции для int (хорошо), но if (flag = true) для boolean компилируется и молча присваивает — следи за этим.
Тернарный оператор
Когда всё, что тебе нужно, — выбрать между двумя значениями, тернарный оператор ?: — это компактная однострочная запись. Читай condition ? a : b как «если условие, то a, иначе b»:
Тернарный оператор возвращает значение, которое можно присвоить или передать напрямую. Оставь его для простого выбора: если какой-то ветви нужно несколько операторов или настоящая логика, полный if-else остаётся читаемым там, где вложенный тернарник быстро превращается в головоломку.
Ловушка: необязательные фигурные скобки
Java позволяет опускать фигурные скобки, когда в ветви всего один оператор, но это провоцирует коварную ошибку. Отступы лгут:
if (loggedIn)
System.out.println("Welcome");
System.out.println("Loading dashboard"); // NOT part of the if!
Только первая строка управляется if; вторая выполняется всегда, что бы ни было, несмотря на то, что отступ намекает на обратное. Всегда используй фигурные скобки — даже для одной строки — и весь этот класс ошибок исчезает.
Далее: switch
Цепочки if-else if идеальны, когда каждая ветвь проверяет своё условие. Но когда ты сверяешь одно значение со многими фиксированными вариантами — названием дня, пунктом меню, перечислением — длинная лестница else if становится однообразной. Оператор switch создан именно для этого, и это следующая страница.
Часто задаваемые вопросы
Как написать оператор if-else в Java?
Поставь булево условие в скобках после if, затем код для выполнения в фигурных скобках и необязательный блок else на случай, когда условие ложно: if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }. Условие должно вычисляться в boolean — Java не примет int, как это делает C.
В чём разница между == и equals() в операторе if в Java?
== проверяет, указывают ли две ссылки на один и тот же объект, тогда как .equals() сравнивает содержимое. Для примитивов вроде int используй ==. Для объектов — особенно String — используй .equals(): if (name.equals("Sam")), а не if (name == "Sam"). Использование == со строками — самая частая ошибка в if в Java.
Что такое тернарный оператор в Java?
Тернарный оператор condition ? valueIfTrue : valueIfFalse — это компактный if-else, который возвращает значение. Например, String label = age >= 18 ? "adult" : "minor"; присваивает одно из двух значений в зависимости от условия. Используй его для простого выбора значения; переходи к полному if-else, когда в каждой ветви нужно выполнять логику.