¿Puede alguien decirme por qué esto es válido en Java:
for (int i= 1; i<11; i++){
Movie movie = randomMovie();
}
y esto no es?
for (int i= 1; i<11; i++)
Movie movie = randomMovie();
Yo no lo entiendo, porque me parece que es exactamente lo mismo, pero cuando pongo las llaves, que de repente se vuelve correcto.
Debido a que la gramática de Java prohíbe este último. Las reglas gramaticales relevantes son:
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
Tenga en cuenta que lo anterior no incluyen LocalVariableDeclarationStatement
.
Puede encontrar la gramática sintáctica completa para Java en JLS Capítulo 19 .
hipotética pregunta para usted. Suponiendo que el siguiente código es válido de Java:
for (int i = 1; i < limit; i++)
Movie movie = randomMovie();
System.out.println("The last movie is " + movie);
¿cuál es el alcance de la movie
variable?
La respuesta es que es debe salir del alcance inmediato 1 . Lo cual lo convierte en un inútil declaración, y el uso de la println
llamada es un error de compilación.
Yo creo que esta es la razón por la que especifican la sintaxis de Java para no permitir esto. La declaración es inútil y lo más probable es un error, y debe ser puesta en conocimiento del programador a través de un error de compilación.
(Por el mismo argumento en la declaración
for (int i = 1; i < 11; i++){
Movie movie = randomMovie();
}
También es un error. Pero hacer algo sobre esto en la gramática de la lengua sería difícil.)
1 - La alternativa no es sostenible. En un lenguaje estáticamente comprobado como Java, no se puede tener una situación donde sólo una variable dentro del alcance existe en función de una ruta de ejecución anterior. Eso sería el valor de movie
ser si limit
era cero?