Ошибка компилятора при объявлении переменной внутри условия if и без фигурных скобок
почему это "первый"!--1--> компиляция хорошо и второй сбой?
if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)
5 ответов:
потому что спецификация языка говорит так:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html
объявление вводит объект в программу и включает идентификатор (§3.8), который может использоваться в имени для ссылки на этот объект. Объявленный объект является одним из следующих:
...
Локальная переменная, одна из следующих:
* Локальная переменная, объявленная в блоке (§14.4)
* Локальная переменная объявлено в заявлении for (§14.14)ваш первый пример-объявление
i
внутри блока (обозначается фигурными скобками). Ваш второй не является, и это неfor
заявление.редактировать, чтобы добавить: что просто делает здравый смысл. Если бы это было разрешено, это было бы бесполезно. Он сразу же выпадет из поля зрения.
Block: { BlockStatementsopt } BlockStatements: BlockStatement BlockStatements BlockStatement BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statementи
IfThenStatement: if ( Expression ) Statementкажется,
int i
этоLocalVariableDeclarationStatement
, а неStatement
. Так что это не работает.
Это потому, что это не было бы полезным кодом. Если у вас есть оператор if без фигурных скобок ({}), выполняется только первая строка / оператор после if. Поэтому, если вы объявляете только локальную переменную, ее нельзя использовать нигде больше. Так что декларировать это совершенно излишне.
if(proceed){ int i= 0; // variable i can be used here //... } if (proceed) int i; // i can not be used anywhere as it is a local variable
Если (продолжить) int i;
Если мы используем
if
оператор без фигурных скобок он будет выполнять только первую строку сif
для условной манере. Остальные строки будут выполняться нормально.это ошибка компиляции, потому что объявление локальной переменной происходит с условным образом, и компилятор предполагает, что он недоступен с помощью ложного оператора.
Если вы используете фигурные скобки, то объявление переменной и использование локальной переменной внутри блока и следовательно, компилятор предполагает, что это достижимый код. Тогда нет ошибок компилятора.