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 лекция
Недоступна
Программа лояльности в магазине 🛍️
Программа лояльности в магазине 🛍️
Комментарии (17)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Илья Уровень 4
28 декабря 2025
В первом примере "Проход в клуб" при запуске программы доходя до этапа введения возраста > 18 сразу появляются строки: Введите пригласительный код: Извините, неверный код. Доступ запрещён
Дмитрий Уровень 10
6 ноября 2025
Чисто по инструкции код писать вообще неинтересно!
Илья Уровень 4
14 ноября 2025
Я стираю их и делаю с нуля сам, попробуй
DimaSergeew Уровень 4
22 октября 2025
Тут действительно не хватает задач Hard где надо подумать своей головой без подсказок!
Archibald26 Уровень 5
28 ноября 2025
параллельно можешь переходить на *cod*e*wars* например. Интересное закрепление практических задач.
Дмитрий Уровень 4
18 октября 2025
Объясните про поглощение символа строки🧐
Ksanders Уровень 32
21 сентября 2025
Лекция в целом неплохая. Но не хватает задач уровня сложности повыше этих, где будет меньше подсказок и не будет заготовок структуры программы. А так - ни в одной из этих задач думать над вложенностью условий вообще не нужно, можно сказать что задачи наполовину решены уже изначально. Проверяется не мышление, а что ученик правильно понял куда какое условие подставить 🙂
Sirius_ Уровень 4
17 января 2026
Задачи на внимательность к мелочам. Для новичков и это бывает сложным. Нельзя просто скопировать и вставить. Важно не вставить лишнее и не пропустить необходимое. Пусть сначала это усвоят. Выпендриваться не стоит. У каждого свой уровень подготовки. У кого-то его вообще нет, и для него решение таких задач с подсказками уже успех.
Vitalii Уровень 32 Expert
7 сентября 2025

console.nextLine(); // Поглощаем оставшийся символ новой строки
Почему в теме про сканер нельзя было объяснить этот момент???!!! Я то уже здесь "старожил" и знаю, что nextInt() не считывает символ переноса строки, а вот как быть зелёным новичкам??? Сколько нервов можно сэкономить, если написать небольшой абзац про эту большую для новичков проблему. Или вот

int age = Integer.parseInt(console.nextLine());
Тут же валидатор принимает решение и тут же сбоку выдаёт, что consol.nextLine() может быть равно null ... Или я что-то не так понял... Одновременно понимаю, что, возможно, объём знаний на этом уровне не достаточен для объяснения таких нюансов. Но в то же время попробовать можно. Кому очень интересно, тот разберётся. А вот интересная статья про сравнение строк и Йоду: https://javarush.com/groups/posts/2736-uslovija-yodih-ili-yoda-conditions
REK.QA Уровень 4
10 сентября 2025
А что такое термин "поглащаем"?
Vitalii Уровень 32 Expert
10 сентября 2025
Вот здесь всё объясняется: (https://ru.stackoverflow.com/questions/1164454/java-scanner-не-записывает-данные-в-переменную)
Anton Pohodin Уровень 27
20 сентября 2025
По-моему для чисел типа int логичнее использовать такой код:

int age = console.nextInt();
А мучаются с этим парсеИнт пусть те, кому это нравится. Чем проще программа, тем лучше.
Vitalii Уровень 32 Expert
20 сентября 2025
Позже вы обязательно встретите проблему связанную с nextInt()...
Ksanders Уровень 32
21 сентября 2025
спасибо, надо будет почитать отдельно!
Anonymous #3656771 Уровень 20
29 сентября 2025
Спасибо от зелёного новичка! Полез за пояснительной бригадой, а ты уже ответил на вопрос :-)
Antariko Уровень 1
2 октября 2025
Однажды вы встретите момент когда запустите код, который считает ваше число и тут же перескочит следующий запрос ввода, не дав вам ничего сделать. И вот тогда вы поймёте зачем был нужен парсер.
Anton Pohodin Уровень 27
2 октября 2025
Возможно, этот парсер пригодится, если буду заниматься разработкой Java-приложений с формами (Java FX), считать число из textbox, например.