Выписка с фигурными скобками недействительна - PullRequest
1 голос
/ 08 января 2020

Может кто-нибудь сказать мне, почему это действительно в Java:

for (int i= 1; i<11; i++){
       Movie movie = randomMovie();
}

, а это не так?

for (int i= 1; i<11; i++)
      Movie movie = randomMovie();

Я не понимаю, потому что мне кажется, быть точно таким же, но когда я ставлю фигурные скобки, они неожиданно становятся правильными.

enter image description here

Ответы [ 2 ]

1 голос
/ 08 января 2020

Потому что грамматика Java запрещает последнее. Соответствующие правила грамматики:

BasicForStatement:
    for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement 

Statement:
    StatementWithoutTrailingSubstatement
    LabeledStatement
    IfThenStatement
    IfThenElseStatement
    WhileStatement
    ForStatement

StatementWithoutTrailingSubstatement:
    Block
    EmptyStatement
    ExpressionStatement
    AssertStatement
    SwitchStatement
    DoStatement
    BreakStatement
    ContinueStatement
    ReturnStatement
    SynchronizedStatement
    ThrowStatement
    TryStatement

Обратите внимание, что вышеприведенное не включает LocalVariableDeclarationStatement.

. Вы можете найти полную грамматику syntacti c для Java в JLS Глава 19 .


Гипотетический вопрос для вас. Предположим, что следующий код является действительным Java:

for (int i = 1; i < limit; i++)
     Movie movie = randomMovie();
System.out.println("The last movie is " + movie);

какова область действия переменной movie?

Ответ таков: * go должен немедленно выйти из области видимости 1 . Это делает объявление бесполезным , а использование в вызове println является ошибкой компиляции.

I считают , что именно по этой причине они указали Java синтаксис, чтобы запретить это. Объявление бесполезно и, скорее всего, является ошибкой и должно быть доведено до сведения программиста через ошибку компиляции.

(По тому же аргументу объявление в

for (int i = 1; i < 11; i++){
     Movie movie = randomMovie();
}

также является ошибкой Но сделать что-то с этим в грамматике языка было бы сложно.)


1 - Альтернатива не является приемлемой. В статически проверенном языке, таком как Java, не может быть ситуации, когда переменная в области видимости существует только в зависимости от более раннего пути выполнения. Что бы значение movie было бы, если бы limit было равно нулю?

1 голос
/ 08 января 2020

Проверьте, работает ли это.

Movie movie = null;
for (int i= 1; i<11; i++)
      movie = randomMovie();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...