Бесплатный открытый урок: условия 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. Строгая типизация здесь работает на вас.
Задание для самопроверки
- Напишите программу, которая по числу месяца печатает время года. Сделайте это дважды: через
else ifи черезswitch. - Проверьте, является ли год високосным: он делится на 4, но не на 100, кроме годов, делящихся на 400. Проверьте на 2000, 1900 и 2024.
- Сравните две строки, введённые как
"да"и"Да", сначала черезequals, потом черезequalsIgnoreCase.
Что дальше
Предыдущий урок — переменные и типы данных, следующий — циклы: for, while и do-while. Все бесплатные занятия собраны в разделе «Уроки Java».