Управление ходом программы
Без управляющих конструкций программа выполняет инструкции строго сверху вниз. Условия выбирают, какая ветка выполнится, циклы повторяют блок, а break и continue меняют порядок изнутри цикла. Условия в Java строго типизированы: в if и while можно передать только boolean, и if (x) для числа не скомпилируется, в отличие от C или JavaScript.
Главная развилка темы — два вида switch. Классический, с двоеточием, проваливается из одной ветки в следующую, пока не встретит break. Стрелочный (Java 14) не проваливается и может вернуть значение как выражение. На собеседовании проверяют, понимаете ли вы разницу и почему компилятор требует, чтобы switch-выражение покрыло все значения.
Карта темы
- if, else и ?: — условие только
boolean, ловушкаifбез фигурных скобок, тернарный оператор как выражение. - Классический switch —
case,break,default, проваливание и допустимые типы селектора. - switch-выражения —
case ->без проваливания, несколько меток,yieldи требование покрыть все значения. - Циклы —
while,do-while,forи порядок частей его заголовка, for-each и область видимости переменной цикла. - break и continue — выход из цикла, переход к следующей итерации и метки для вложенных циклов.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Писать if (x) или if (x = 5) для int x | Не компилируется: условие должно иметь тип boolean |
Писать if без фигурных скобок для двух инструкций | Под условие попадает только первая, вторая выполняется всегда |
Забыть break в классическом switch | Выполнение проваливается в следующие case до первого break |
Оставить switch-выражение по int без default | Не компилируется: выражение обязано покрыть все значения селектора |
Смешать case 1 -> и case 2: в одном switch | Не компилируется: стрелочные и классические метки не смешиваются |
Обратиться к переменной for после цикла | Не компилируется: она видна только внутри цикла |
Писать i <= a.length в цикле по массиву | Последняя итерация бросает ArrayIndexOutOfBoundsException |
Вызвать continue в while до изменения счётчика | Цикл повторяет ту же итерацию бесконечно |
Ждать, что break внутри switch прервёт цикл | break выходит только из switch; для цикла нужна метка |
Значение для собеседований
Вопросов вроде «как работает if» на собеседовании не бывает. Тему проверяют задачками на вывод: switch без break, do-while с ложным условием, continue вместе с break, break с меткой. Второй пласт вопросов — современный switch: чем стрелочная форма отличается от классической, что такое yield и почему switch-выражение должно быть исчерпывающим.
Что обычно проверяют:
- Проваливание в классическом
switchи рольbreak. - Разницу между инструкцией
switchи switch-выражением,yield, исчерпывающее покрытие. - Какие типы принимает
switchс константами:intи меньшие целые,char, обёртки,String, перечисления. whileпротивdo-while, порядок частейfor, видимость переменной цикла.breakиcontinueво вложенных циклах и метки.
Типичный неверный ответ: «break в switch нужен для порядка, без него всё равно выполнится только найденная ветка». Это открывает разговор о проваливании: классический switch прыгает на найденную метку и выполняет всё ниже неё, пока не встретит break или конец блока.