поведение компилятора на фигурных скобках и точка с запятой if - PullRequest
0 голосов
/ 31 марта 2019

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

Для практики я использую ОСА JavaSE 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 (= правильный ответ)

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

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

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

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

Вот как (действительный) код Java в опции 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.

0 голосов
/ 31 марта 2019

Ответ E скомпилируется, потому что символ ; является допустимым оператором в Java. В этом случае оператор if просто имеет пустое тело и не имеет смысла, но он действителен.

Из Java-спецификация 14.6. Пустое заявление :

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

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


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

См. java spec 14.2. Блоки

...