Потому что грамматика 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
было равно нулю?