Глиф Учебники

Урок 4. Условия: if, else и switch

Курс «Java» · урок 4 из 10 · 4 минуты чтения

До сих пор программы выполняли команды подряд, одну за другой. Условие позволяет выбрать: если что-то верно — сделать одно, иначе — другое.

if и else

Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        if (n % 2 == 0) {
            System.out.println(n + " — чётное");
        } else {
            System.out.println(n + " — нечётное");
        }
    }
}
Ввод
7
Вывод
7 — нечётное

Условие пишется в круглых скобках после if, его результат — boolean, то есть true или false. Если условие истинно, выполняется блок в фигурных скобках после if, иначе — блок после else. Часть с else можно не писать.

n = 7 ввели 7 n % 2 == 0 7 % 2 = 1 true блок if — пропущен 7 — чётное false блок else — выполнен 7 — нечётное дальше по программе
При n = 7 остаток 7 % 2 равен 1, условие n % 2 == 0 ложно — блок if пропускается, выполняется блок else с выводом «7 — нечётное», и программа идёт дальше.

Фигурные скобки при одной команде формально не обязательны, но ставьте их всегда: если позже добавить вторую команду, без скобок она окажется вне условия и будет выполняться всегда.

Сравнения

ЗаписьЗначит
a == bравно
a != bне равно
a < b, a > bменьше, больше
a <= b, a >= bменьше или равно, больше или равно

Сравнение — это два знака ==. Один знак = — присваивание, и if (x = 5) компилятор не пропустит: ошибка incompatible types: int cannot be converted to boolean.

Строки так сравнивать нельзя: == проверяет, один ли это объект в памяти, а не одинаковый ли текст. Для строк пишут s.equals("да"). Подробно — в справке Сравнение строк: == и equals.

Несколько вариантов: else if

Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int score = in.nextInt();
        if (score >= 90) {
            System.out.println("Отлично");
        } else if (score >= 70) {
            System.out.println("Хорошо");
        } else if (score >= 50) {
            System.out.println("Удовлетворительно");
        } else {
            System.out.println("Нужно подтянуть");
        }
    }
}
Ввод
75
Вывод
Хорошо

Условия проверяются сверху вниз, и срабатывает первое истинное — остальные уже не проверяются. Поэтому порядок важен: если поставить score >= 50 первым, на 95 баллов программа ответит «Удовлетворительно».

score = 75 score >= 90 false нет score >= 70 true да Хорошо да Отлично нет score >= 50 не проверяется да Удовлетворительно нет else не доходит Нужно подтянуть
При score = 75 условие score >= 90 ложно, а score >= 70 истинно — выводится «Хорошо», а до score >= 50 и else дело уже не доходит.

Логические операции

Java
public class Main {
    public static void main(String[] args) {
        int year = 1900;
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            System.out.println(year + " — високосный");
        } else {
            System.out.println(year + " — обычный");
        }
    }
}
Вывод
1900 — обычный

Год високосный, если делится на 4, но не на 100, или если делится на 400. 1900 делится на 100, но не на 400 — значит, обычный.

&& и || вычисляют правую часть только при необходимости: в x != 0 && 10 / x > 1 деления на ноль не будет, потому что при x == 0 левая часть уже ложна. Двойной диапазон пишут через &&: age >= 7 && age <= 17 — запись 7 <= age <= 17 в Java не работает.

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

Короткий выбор одного из двух значений: условие ? если_да : если_нет. «Тернарный» значит «из трёх частей»: условие и два значения.

Java
public class Main {
    public static void main(String[] args) {
        int a = 8;
        int b = 13;
        int max = a > b ? a : b;
        String word = max % 2 == 0 ? "чётное" : "нечётное";
        System.out.println(max + " — " + word);
    }
}
Вывод
13 — нечётное

switch: выбор по значению

Когда одну переменную сравнивают с несколькими точными значениями, удобнее switch. Классическая запись:

Java
public class Main {
    public static void main(String[] args) {
        int day = 6;
        switch (day) {
            case 1:
                System.out.println("Понедельник");
                break;
            case 2:
                System.out.println("Вторник");
                break;
            case 6:
            case 7:
                System.out.println("Выходной");
                break;
            default:
                System.out.println("Другой будний день");
        }
    }
}
Вывод
Выходной

default срабатывает, если не подошёл ни один case. Главная ловушка — break. Без него выполнение проваливается в следующий case:

Java
public class Main {
    public static void main(String[] args) {
        int n = 1;
        switch (n) {
            case 1:
                System.out.println("один");
            case 2:
                System.out.println("два");
                break;
            case 3:
                System.out.println("три");
        }
    }
}
Вывод
один
два

switch со стрелками

С Java 14 есть запись со стрелкой ->. В ней нет проваливания, break не нужен, а несколько значений перечисляются через запятую. switch умеет работать и со строками:

Java
public class Main {
    public static void main(String[] args) {
        String command = "stop";
        switch (command) {
            case "start" -> System.out.println("Запуск");
            case "stop", "exit" -> System.out.println("Остановка");
            default -> System.out.println("Неизвестная команда");
        }
    }
}
Вывод
Остановка
классический switch n = 1 case 1: System.out.println("один"); case 2: провалились из case 1 System.out.println("два"); break; case 3: System.out.println("три"); выход switch со стрелками command = "stop" case "start" -> выводит «Запуск» default -> выводит «Неизвестная команда» case "stop", "exit" -> выводит «Остановка» выход проваливания нет, break не нужен
В классическом switch при n = 1 без break после case 1 выполнение проваливается в case 2 и выходит только на break; в switch со стрелками выполняется лишь ветка case "stop", "exit".

Такой switch может и вернуть значение — тогда его результат кладут в переменную, а после закрывающей скобки ставят точку с запятой:

Java
public class Main {
    public static void main(String[] args) {
        int month = 4;
        String season = switch (month) {
            case 12, 1, 2 -> "зима";
            case 3, 4, 5 -> "весна";
            case 6, 7, 8 -> "лето";
            case 9, 10, 11 -> "осень";
            default -> "нет такого месяца";
        };
        System.out.println(season);
    }
}
Вывод
весна

Здесь default обязателен: у выражения должно получиться значение при любом month. Если для варианта нужно несколько команд, их берут в фигурные скобки, а значение возвращают словом yield: case 2 -> { System.out.println("Февраль"); yield "зима"; }.

Частые ошибки

Коротко

Проверьте себя

1. Что выведет программа при score = 95?
Java
if (score >= 50) {
    System.out.println("Удовлетворительно");
} else if (score >= 90) {
    System.out.println("Отлично");
}
2. Как записать «x от 1 до 10 включительно»?
3. Что выведет классический switch при n = 1, если в case 1 нет break, а case 2 печатает «два» и заканчивается break?
4. Чем switch со стрелками -> отличается от классического?