Как работает синтаксис условия if с точкой с запятой в Java
Что проверяют
Знаете ли вы грамматику операторов Java настолько, чтобы увидеть ловушку, которую компилятор пропускает молча. Следом обычно показывают похожий код с while или for и спрашивают, как такое ловить до продакшена.
Как отвечать
Тело if это ровно один оператор. Точка с запятой сама по себе тоже оператор, пустой (empty statement). Поэтому в записи if (x > 5); { System.out.println("больше"); } условие проверяется, при истине выполняется пустой оператор, и на этом if заканчивается. Фигурные скобки дальше это отдельный блок, который к условию не относится и выполняется всегда. Код компилируется без ошибок.
Что ещё стоит сказать:
- с
else: ловушка вскрывается сама,if (c); { ... } else { ... }не скомпилируется с ошибкой'else' without 'if', потому что между ними оказался посторонний блок; - с
while: последствия хуже,while (i < 10);при неизменномiкрутит пустой цикл вечно, и до блока в скобках дело не доходит; - с
for: цикл отработает впустую, а блок после него выполнится один раз; - переменные: объявленные внутри такого блока видны только в нём, это обычная область видимости блока.
Как ловить: javac -Xlint:empty предупреждает о пустом операторе после if, IntelliJ IDEA подсвечивает такое инспекцией, в Checkstyle есть проверка EmptyStatement. Самая надёжная защита это правило ставить фигурные скобки всегда и держать открывающую на одной строке с условием, тогда лишнюю точку с запятой видно сразу.
Где спотыкаются
Уверенно говорят, что это ошибка компиляции. Это корректный код, в этом и опасность.
Объясняют, что блок «выполнится, если условие ложно», путая его с else. Он выполнится при любом условии.
Не могут назвать, чем такое ловить. Интервьюеру важен не только разбор синтаксиса, но и то, что в вашем проекте подобное отсекут линтер и ревью.