Ветвления в Java: if, else и switch — бесплатный урок

Ветвления в Java: if, else и switch

Бесплатный открытый урок: условия if и else, логические операторы, оператор switch и три ловушки, на которых спотыкаются почти все новички. Примеры проверены на JDK 21.

if, else if, else

Условие в скобках обязано быть логическим выражением типа boolean. Ветки проверяются сверху вниз, и выполняется только первая подошедшая.

public class Ocenka {
    public static void main(String[] args) {
        int ball = 73;

        if (ball >= 90) {
            System.out.println("Отлично");
        } else if (ball >= 75) {
            System.out.println("Хорошо");
        } else if (ball >= 60) {
            System.out.println("Удовлетворительно");
        } else {
            System.out.println("Не сдано");
        }
    }
}
Удовлетворительно

Порядок веток важен: если поставить ball >= 60 первой, отличник тоже получит «Удовлетворительно». Фигурные скобки формально не обязательны для одной инструкции, но ставьте их всегда — так добавленная позже строка не окажется за пределами условия.

Логические операторы и сравнение строк

public class Usloviya {
    public static void main(String[] args) {
        int vozrast = 20;
        boolean estBilet = true;

        System.out.println(vozrast >= 18 && estBilet);
        System.out.println(vozrast < 18 || estBilet);
        System.out.println(!estBilet);

        String vvod = "Ja";
        String slovo = vvod + "va";

        System.out.println(slovo == "Java");
        System.out.println(slovo.equals("Java"));
        System.out.println("JAVA".equalsIgnoreCase(slovo));
    }
}
true
true
false
false
true
true

Ловушка первая. Четвёртая строка вывода — false, хотя в переменной лежит слово «Java». Оператор == для объектов сравнивает не содержимое, а ссылки: слева строка, собранная во время работы программы, справа — литерал из пула констант. Строки всегда сравнивают методом equals, а без учёта регистра — equalsIgnoreCase.

Операторы && и || вычисляются лениво: если левая часть уже определила результат, правая не выполняется. Именно поэтому проверку slovo != null && slovo.equals("Java") пишут в таком порядке, а не наоборот.

Тернарный оператор

Когда ветки лишь выбирают значение, вместо четырёх строк if пишут одну:

int chislo = 8;
String chetnost = chislo % 2 == 0 ? "чётное" : "нечётное";
System.out.println(chislo + " — " + chetnost);
8 — чётное

switch: выбор из нескольких вариантов

Когда одну переменную сравнивают с набором значений, switch читается лучше лестницы из else if. Он работает с целыми числами, символами, строками и перечислениями.

public class DenNedeli {
    public static void main(String[] args) {
        int den = 6;
        String nazvanie;

        switch (den) {
            case 1:
                nazvanie = "понедельник";
                break;
            case 6:
            case 7:
                nazvanie = "выходной";
                break;
            default:
                nazvanie = "будний день";
        }

        System.out.println(nazvanie);
    }
}
выходной

Ловушка вторая. Без break выполнение «проваливается» в следующую ветку и идёт дальше до конца:

int uroven = 1;

switch (uroven) {
    case 1:
        System.out.println("первый");
    case 2:
        System.out.println("второй");
    default:
        System.out.println("готово");
}
первый
второй
готово

Иногда это делают намеренно — как в примере с выходными, где две метки case идут подряд, — но чаще пропущенный break оказывается ошибкой.

Сравнение дробных чисел

Ловушка третья продолжает урок о типах данных: double хранит числа приблизительно, поэтому сравнивать их на точное равенство нельзя.

System.out.println(0.1 + 0.2 == 0.3);
System.out.println(Math.abs(0.1 + 0.2 - 0.3) < 0.000001);
false
true

Присваивание вместо сравнения

В некоторых языках такая опечатка приводит к неуловимой ошибке во время работы программы. В Java условие обязано быть логическим, поэтому код просто не соберётся:

int ball = 73;

if (ball = 100) {
    System.out.println("максимум");
}

Компилятор сообщит incompatible types: int cannot be converted to boolean. Строгая типизация здесь работает на вас.

Задание для самопроверки

  1. Напишите программу, которая по числу месяца печатает время года. Сделайте это дважды: через else if и через switch.
  2. Проверьте, является ли год високосным: он делится на 4, но не на 100, кроме годов, делящихся на 400. Проверьте на 2000, 1900 и 2024.
  3. Сравните две строки, введённые как "да" и "Да", сначала через equals, потом через equalsIgnoreCase.

Что дальше

Предыдущий урок — переменные и типы данных, следующий — циклы: for, while и do-while. Все бесплатные занятия собраны в разделе «Уроки Java».