Ошибка компилятора при объявлении переменной внутри условия if и без фигурных скобок - PullRequest
58 голосов
/ 09 февраля 2012

Почему это первое if хорошо компилируется, а второе не получается?

if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)

Ответы [ 5 ]

72 голосов
/ 09 февраля 2012

Поскольку в спецификации языка сказано:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

Объявление вводит сущность в программу и включает идентификатор (§3.8), который можно использовать вимя для ссылки на этот объект.Объявленная сущность является одной из следующих:
...
Локальная переменная, одна из следующих:
* Локальная переменная, объявленная в блоке (§14.4)
* Локальная переменная, объявленнаяв выражении for (§14.14)

Ваш первый пример - объявление i внутри блока (обозначается фигурными скобками).Ваш второй не является и не является for утверждением.

Отредактировано, чтобы добавить: Что просто имеет смысл в общем.Если бы это было разрешено, это было бы бесполезно.Это немедленно выпало бы из области видимости.

53 голосов
/ 09 февраля 2012

Из Спецификации языка Java .

    <i>Block</i>:
            { <i>BlockStatements</i><sub>opt</sub> }

    <i>BlockStatements</i>:
            <i>BlockStatement</i>
            <i>BlockStatements</i> <i>BlockStatement</i>

    <i>BlockStatement</i>:
            <i>LocalVariableDeclarationStatement</i>
            <i>ClassDeclaration</i>
            <i>Statement</i>

и

    IfThenStatement:
            if ( <i>Expression</i> ) <i>Statement</i>

Кажется, что int i это LocalVariableDeclarationStatement, а не Statement.Так что это не работает.

12 голосов
/ 09 февраля 2012

Это потому, что не будет полезного кода.Если у вас есть оператор 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
3 голосов
/ 09 февраля 2012

if (продолжить) int i;

Если мы используем оператор if без фигурных скобок, он будет выполнять только первую строку с if для условного метода.Другие строки будут выполняться нормально.

Это ошибка компиляции, потому что объявление локальной переменной происходит условным образом, и компилятор предполагает, что оно не достижимо с помощью оператора false.

Если вы используете фигурные скобки, тогда объявление переменной и использованиелокальная переменная внутри блока и, следовательно, компилятор предполагает, что это достижимый код.Тогда нет ошибок компилятора.

0 голосов
/ 16 февраля 2012

Как и в Java / C ++, если мы пишем без скобок, выполняется только 1-й оператор В этом случае переменная i бесполезна. Вы объявляете его в операторе if и его область действия заканчивается после этого оператора, что бесполезно

В C ++ это разрешено, но Java не позволяет это

...