Вот мое понимание. Цитата из Chapter 14 of JAVA SE 7 specification:
14.2. Блоки
Блок представляет собой последовательность операторов, локальных деклараций классов и операторов локальных переменных в фигурных скобках.
Block:
{ BlockStatementsopt }
........
BlockStatement:
LocalVariableDeclarationStatement
ClassDeclaration
Statement
Так блок всегда в фигурных скобках { ... }
.
14.4. Локальные заявления о декларации переменных
Локальный оператор объявления переменных объявляет одно или несколько локальных имен переменных .
LocalVariableDeclarationStatement:
LocalVariableDeclaration ;
LocalVariableDeclaration:
VariableModifiersopt Type VariableDeclarators
.......
VariableDeclarator:
VariableDeclaratorId
VariableDeclaratorId = VariableInitializer
.......
Каждый местный оператор объявления переменных немедленно содержащихся в блоке. Локальные инструкции описания переменных могут быть смешаны с свободно с другими видами операторов в блоке.
Теперь, что это значит, «немедленно содержится»?
Некоторые утверждения содержат другие утверждения как часть их структуры; такие другие утверждения являются подстановками инструкции. Мы говорим, что оператор S сразу содержит оператор U, если нет оператора T, отличного от S и U, такого, что S содержит T и T содержит U. В таким же образом некоторые утверждения содержат выражения (§15) как часть их структуры.
Давайте посмотрим на ваш пример:
public class Test{
public void newMethod(){
if(true)int i=0;
}
}
В этом случае мы имеем следующий блок:
{
if(true)int i=0;
}
Внутри этого блока мы имеем If Statement
:
if(true)int i=0;
Этот оператор, в свою очередь, содержит локальный var iable declare:
int i=0;
Таким образом, состояние нарушено. Напомним: Каждый локальный оператор объявления переменной немедленно содержится в блоке. Однако в этом случае объявление локальной переменной содержится в инструкции If, которая не является самим блоком, а содержит другой блок. Следовательно, этот код не будет компилироваться.
Единственное исключение для for
цикла:
A local variable declaration can also appear in the header of a for statement (§14.14). In this case it is executed in the same manner as if it were part of a local variable declaration statement.
(Вам может понадобиться перечитать его несколько раз, чтобы понять.)
всегда использовать скобки ... – aldanux
Я не Java программист, но я полагаю, потому что однозадачная версия 'if' не разрешает объявления переменных. И почему это нужно, поскольку ничто никогда не сможет использовать эту переменную? –
Это на самом деле имеет большой смысл! Я не знаю, как я это забыл. – TonyTerminator