Урок 4. Условия: if, else и switch
До сих пор программы выполняли команды подряд, одну за другой. Условие позволяет выбрать: если что-то верно — сделать одно, иначе — другое.
if и else
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 + " — нечётное");
}
}
}77 — нечётноеУсловие пишется в круглых скобках после if, его результат — boolean, то есть true или false. Если условие истинно, выполняется блок в фигурных скобках после if, иначе — блок после else. Часть с else можно не писать.
Фигурные скобки при одной команде формально не обязательны, но ставьте их всегда: если позже добавить вторую команду, без скобок она окажется вне условия и будет выполняться всегда.
Сравнения
| Запись | Значит |
|---|---|
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
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 баллов программа ответит «Удовлетворительно».
Логические операции
&&— «и»: истинно, когда истинны обе части;||— «или»: истинно, когда истинна хотя бы одна часть;!— «не»: меняетtrueнаfalseи наоборот.
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 не работает.
Тернарный оператор
Короткий выбор одного из двух значений: условие ? если_да : если_нет. «Тернарный» значит «из трёх частей»: условие и два значения.
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. Классическая запись:
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:
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 умеет работать и со строками:
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 может и вернуть значение — тогда его результат кладут в переменную, а после закрывающей скобки ставят точку с запятой:
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 "зима"; }.
Частые ошибки
- Точка с запятой после условия:
if (x > 0);— условие закончилось на;, а блок в скобках выполняется всегда. - Проверка нечётности через
n % 2 == 1: для отрицательных чисел остаток отрицательный (-7 % 2равно −1). Пишитеn % 2 != 0. - Забытый
breakв классическомswitch— выполняются и следующие варианты.
Коротко
if (условие) { … } else if (…) { … } else { … }— срабатывает первая ветка с истинным условием.- Сравнение —
==, присваивание —=; строки сравнивают черезequals. &&— «и»,||— «или»,!— «не»; диапазон —a >= 1 && a <= 10.условие ? a : bвыбирает одно из двух значений.- В классическом
switchнуженbreak; в записи со стрелками->его нет, иswitchможет вернуть значение.