JavaRush /Курсы /JAVA 25 SELF /Вложенные if, многоуровневая логика

Вложенные if, многоуровневая логика

JAVA 25 SELF
3 уровень , 2 лекция
Открыта

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. Сколько уровней вложенности допустимо?

Технически — сколько угодно. Но на практике: чем больше вложенных уровней, тем сложнее читать и поддерживать код. Обычно стараются ограничиваться 23 уровнями. Если получается «лесенка» из 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: если возраст не подошёл, только тогда спрашиваем про карту.

1
Задача
JAVA 25 SELF, 3 уровень, 2 лекция
Недоступна
Проверка входа на вечеринку 🥳
Проверка входа на вечеринку 🥳
1
Задача
JAVA 25 SELF, 3 уровень, 2 лекция
Недоступна
Вход в клуб 🌃
Вход в клуб 🌃
1
Задача
JAVA 25 SELF, 3 уровень, 2 лекция
Недоступна
Пригласительные на конференцию 🎤
Пригласительные на конференцию 🎤
1
Задача
JAVA 25 SELF, 3 уровень, 2 лекция
Недоступна
Программа лояльности в магазине 🛍️
Программа лояльности в магазине 🛍️
Комментарии (32)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #6511787 Уровень 3
15 июня 2026
как фармить материю если все задачи с премиумом
Gans Electro Уровень 26
23 мая 2026
Если есть ошибки нужно напрямую писать админам. В вас есть кнопка с конвертом. Там можно писать Зепп Бранниган. Не можно а нужно. Именно комменты под лекциями они читают редко. Их слишком много
Gans Electro Уровень 26
23 мая 2026
Никогда не писал if без скобок, не знал о таком поведений
Камила Ибраева Уровень 4
18 апреля 2026
намного легче решать задачи, заранее удаляя большую часть кода и КОММЕНТАРИИ, которые очень мешают, хоть и изначально должны помогать ориентироваться
KEN Уровень 13
18 марта 2026
Странно, в лекции выше описан пример, в котором программа проверяет есть ли у тебя клубная карта и твой возраст, в зависимости от этого применяет ту или иную скидку и вот что меня смутило. Если вставить этот код в среду разработки Eclipse, то этот код не работает. Выяснилось что: 1. Не указано, что нужно сделать import java.util.Scanner; (иначе джава не знает, где искать сканер) 2. В примерах не показано, что нужно создавать сканнер Scanner console = new Scanner(System.in); прежде чем использовать эту строку, к примеру: int age = console.nextInt(); 3. Самое интересное код просто не работает так как нужно создавать еще один сканер, если он использует другую переменную. Что я имею ввиду: у меня создан Scanner с переменной console и console 1, и вот только тогда код начинает работать корректно, иначе после ввода возраста программа просто прекращается! import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner console = new Scanner(System.in); Scanner console1 = new Scanner(System.in); System.out.print("Введите ваш возраст: "); int age = console.nextInt(); double discount = 0.0; if (age >= 60) { discount = 0.15; } else { System.out.print("Есть ли у вас клубная карта (да/нет)? "); String hasCard = console1.nextLine(); if (hasCard.equals("да")) { discount = 0.07; } } System.out.println("Ваша скидка: " + (discount * 100) + "%"); } } А вот кстати этот момент с 3 пунктом описан в первой задаче, очень интересно, оказывается когда вы вводите свой возраст и нажимаете Enter, то после того как консоль забирает число например 25 ваш возраст, то во входном потоке висит пустая строка, так как вы нажали Enter, и если вы снова запустите консоль, например чтобы спросить имя, то в переменную с именем улетит пустая строка, вот почему программа просто продолжается, хм...
Алексей Уровень 5
4 марта 2026
Прикольно, что в предыдущих тестах требовалось выводить с точностью, как в задании, а здесь вначале задание на вывод написано с кавычками-елочками, а в конце - без.
Tomoto Уровень 16
25 февраля 2026
в чем разница между "VIP".equals(code) и code.equals.("VIP") ?
Алексей Уровень 5
4 марта 2026
жосткий вопросец, ахахаха. Ответик простой - в синтаксисе обращения к методу equals :))
Алексей Уровень 5
4 марта 2026
да и точечка лишняя в code.equals.("VIP") после буковки s
Kazbekov Andrew Уровень 35
4 марта 2026
Никакой принципиальной разницы нет. Определяется лишь порядок следования, сравнимаем X с Y или Y с X. С точки зрения лоигкии мы напишем code.equals("..."), потому что мы ориентируемся вокруг существующего объекта (нашей переменной code)
Anonymous #6510784 Уровень 5
15 июня 2026
Что совой об пень, что пнем об сову - сове все равно не по себе). В обоих случаях проверяется эквивалентность строк.
Tomoto Уровень 16
25 февраля 2026
+
Walter White Уровень 4
14 февраля 2026
Советую сразу как открыли задачу, полностью удалять код и писать самому... Потому что половина кода уже написана разработчиками. Это не есть хорошо... Пишите код полностью сами, только так научитесь чему-то... Пускай и с 10го раза
Walter White Уровень 4
14 февраля 2026
Единственные проблемы могут быть м выводом (ну это же по факту не ошибка):

System.out.println("Ваша скидка 20%."); // правильно
System.out.println("Ваша скидочка 20 процентиков"); //не правильно
Илья Уровень 4
28 декабря 2025
В первом примере "Проход в клуб" при запуске программы доходя до этапа введения возраста > 18 сразу появляются строки: Введите пригласительный код: Извините, неверный код. Доступ запрещён