поведение компилятора при использовании фигурных скобок и инструкции if с точкой с запятой

#java #if-statement #curly-braces

#java #if-statement #фигурные скобки

Вопрос:

Я начал самостоятельно изучать основы Java несколько месяцев назад (на любительском уровне знаком с PHP уже несколько лет).

Для практики я использую учебное пособие OCA Java SE 8 Programmer 1 для программистов, и приведен пример экзаменационного вопроса, который меня смущает в отношении использования фигурных скобок и точек с запятой в if-statement и который я не могу найти в документации Java.

Я не понимаю, почему ответ E разрешен и компилируется.
Я пытался в Netbeans 10 (JDK 11) оценивать предупреждения и подсказки, но это не привело меня к пониманию сути.
Также пытаюсь использовать несколько комбинаций, которые будут компилироваться (только предупреждение о Empty statement ).
if (true) ; {;;{}{}{}} ;;;;;;;;
if (true) ;;{}{{}{}{}}; {;;{}{}{}} ;;;;;;;;
if (true) ;;{}{{}{}{}}; {;;{}{}{}}

Вопрос: Какая из следующих инструкций не будет скомпилирована?
A. if (true) ;
B. if (true) {}
C. if (true) {;}
D. if (true) {;;}
E. if (true) ; {} ;
F. All statements will compile (= правильный ответ)

Пожалуйста, помогите! Заранее спасибо.

Ответ №1:

Я не понимаю, почему answer E разрешен и компилируется.

В Java ; может быть либо завершителем оператора, либо пустым оператором, в зависимости от контекста.

Вот как анализируется (допустимый) Java-код в option E :

   if (true) // <-- "if" and its condition
  ;         // an empty statement which is the "then" part of the "if"
  {}        // an (empty) block statement
  ;         // an empty statement
  

Первые две строки являются завершенным if выражением. Третья и четвертая строки представляют собой инструкции, следующие за if инструкцией.

Комментарии:

1. Хорошо, я понял. Третья и четвертая строки не имеют ничего общего с оператором if. Я пробовал в IDE, когда третья и четвертая строки компилируются даже без первых двух строк.

Ответ №2:

Ответ E будет скомпилирован, потому что оператор symbol ; разрешен в java. В этом случае if оператор просто имеет пустое тело и не имеет смысла, но он действителен.

Из спецификации java 14.6. Пустой оператор:

Пустой оператор ничего не делает. EmptyStatement: ;

Выполнение пустой инструкции всегда завершается нормально.


{} Это просто пустой блок кода, который также разрешен в java.

Смотрите спецификацию java 14.2. Блоки