Какие проблемы возникают при использовании if без скобок в Java?
Что проверяют
Вопрос про стиль, но за ним проверка грамматики Java: тело if без скобок это ровно один оператор, а отступы компилятору безразличны. Следом могут спросить про «висящий else» и про то, как команда закрепляет правило автоматически.
Как отвечать
Назовите конкретные ловушки:
- добавленная строка: к
if (debug) log(x);дописали вторую строку с тем же отступом, и она выполняется всегда. На ревью дифф выглядит правильно, потому что глаз читает отступы; - висящий
else: вif (a) if (b) f(); else g();веткаelseотносится к ближайшемуif, то есть к проверкеb, как бы её ни выровняли; - точка с запятой после условия:
if (x);компилируется, тело пустое, а строка ниже выполняется всегда. Скобки эту ошибку не отменяют, но при единообразном стиле её легче заметить; - закомментированная строка: закомментировали единственный оператор тела, и телом
ifстала следующая строка; - объявление переменной:
if (x) int y = 1;не скомпилируется, объявление без блока не может быть телом условия.
Практика: скобки ставятся всегда, этого требуют и Google Java Style Guide, и классические Code Conventions for the Java Programming Language. Закрепляется правило не договорённостью, а инструментами: NeedBraces в Checkstyle, аналогичное правило в SonarQube, инспекция IntelliJ IDEA, которая добавляет скобки автоматически. Заодно заметьте, что else if это тоже if без скобок внутри else, единственное общепринятое исключение: так цепочка читается проще.
Где спотыкаются
Говорят, что это вопрос вкуса. Ответ сильнее, если вы приводите сценарий бага и объясняете, почему отступы тут обманывают.
Считают, что проблему решит форматтер. Он выровняет отступы по реальной структуре, и ошибка станет видна, но скобки обычно не добавляет: для этого нужен линтер или инспекция.
Описывают «висящий else» наоборот, утверждая, что else относится к внешнему if. Правило обратное: к ближайшему if, у которого ещё нет своего else.