1. Базовый синтаксис вложенного if
В реальной жизни редко встретишь ситуацию, когда решение принимается только по одному критерию. Обычно приходится проверять сразу несколько условий, и они часто зависят друг от друга. Например, чтобы попасть на концерт, недостаточно быть просто взрослым — иногда нужно быть ещё и в списке приглашённых. Вот тут на сцену выходит так называемая многоуровневая логика, и помогают нам в этом вложенные операторы if.
Вложенные условия — это когда один if живёт внутри другого. Представьте коробку в коробке: если внешнее условие выполнилось, только тогда проверяется внутреннее. Это мощный инструмент контроля потока.
Начнём с простого:
if (условиеА)
{
// действия, если условиеА — true (истина)
if (условиеБ)
{
// действия, если оба условия истинны
}
}
if внутри другого
if
Если вам это напоминает матрёшку — вы всё понимаете правильно! Внутренний if будет выполняться только если внешний сработал.
Пример: проход в клуб
Давайте разовьём наше учебное приложение, где пользователь ранее вводил имя и возраст. Теперь добавим второй уровень проверки: допустим, чтобы попасть в закрытый клуб, нужно быть старше 21 года и иметь пригласительный код.
System.out.print("Введите ваше имя: ");
String name = console.nextLine();
System.out.print("Введите ваш возраст: ");
int age = console.nextInt();
if (age >= 21)
{
System.out.print("Введите пригласительный код: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("Добро пожаловать, " + name + ", в VIP-клуб!");
}
else
{
System.out.println("Извините, неверный код. Доступ запрещён.");
}
}
else
{
System.out.println("Извините, вход только с 21 года!");
}
Обратите внимание: внутренний if проверяет код только если возраст уже прошёл проверку. Это экономит ресурсы (и нервы охранника).
2. Сколько уровней вложенности допустимо?
Технически — сколько угодно. Но на практике: чем больше вложенных уровней, тем сложнее читать и поддерживать код. Обычно стараются ограничиваться 2–3 уровнями. Если получается «лесенка» из 4+ вложенных if, подумайте, нельзя ли упростить логику или вынести проверки в методы.
3. Вложенные if и else: ловушки и нюансы
Ошибка новичков: небрежное использование фигурных скобок.
В Java при использовании else действует жёсткое правило: без фигурных скобок {} к if или else относится только первая команда после них. Это частый источник досадных багов.
Пример с потенциальной ошибкой:
if (age >= 21)
if (code.equals("VIP2024"))
System.out.println("Добро пожаловать!");
else
System.out.println("Неверный код.");
Многие ожидают, что else относится к проверке возраста, но на самом деле оно относится к ближайшему перед ним if (проверке кода приглашения). Поэтому сообщения могут показываться не так, как ожидалось. Лучше всегда использовать скобки — даже если внутри только одна строка!
Чтобы не было недопонимания, компилятор видит этот код так:
if (age >= 21)
{
if (code.equals("VIP2024"))
System.out.println("Добро пожаловать!");
else
System.out.println("Неверный код.");
}
Важно! Ещё раз: если в конструкции if-else не расставлены фигурные скобки, else относится к предыдущему (ближайшему к нему) if.
4. Альтернативы: else if во вложенных условиях
Иногда внутри внешнего if хочется не только проверить одно дополнительное условие, но и предусмотреть альтернативу. Например, если пригласительный код не подошёл, можно предложить гостевой доступ или отказать.
if (age >= 21)
{
System.out.print("Введите пригласительный код: ");
String code = console.nextLine();
if (code.equals("VIP2024"))
{
System.out.println("Добро пожаловать в клуб!");
}
else if (code.equals("GUEST"))
{
System.out.println("Гостевой режим: доступ только до 23:00.");
}
else
{
System.out.println("Увы, доступ невозможен.");
}
}
else
{
System.out.println("Вход только с 21 года.");
}
Здесь внутри внешнего выбора мы делаем вложенный выбор между тремя сценариями: VIP-код, гостевой код и отказ.
5. Практика: калькулятор скидки с многоуровневой логикой
Пусть пользователю начисляется скидка на основе возраста и наличия клубной карты.
- Если возраст пользователя больше или равен 60 — скидка 15%.
- Если возраст меньше, но у пользователя есть клубная карта — скидка 7%.
- В остальных случаях скидки нет.
Как это оформить?
System.out.print("Введите ваш возраст: ");
int age = console.nextInt();
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
System.out.print("Есть ли у вас клубная карта (да/нет)? ");
String hasCard = console.nextLine();
if (hasCard.equals("да"))
{
discount = 0.07;
}
}
System.out.println("Ваша скидка: " + (discount * 100) + "%");
Здесь мы использовали вложенный if внутри ветки else: если возраст не подошёл, только тогда спрашиваем про карту.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ