Почему переменные не могут быть объявлены в операторе if?

следующий код Java не компилируется.

int a = 0;

if(a == 1) {
    int b = 0;
}

if(a == 1) {
    b = 1;
}

почему? Не может быть пути кода, ведущего к программе, присваивающей 1 b не объявив ее.

мне пришло в голову, что может быть ограничена первым if заявление, но тогда я не понимаю, почему. Что делать, если я действительно не хочу объявлять b без необходимости, чтобы улучшить производительность? Мне не нравится, когда переменные остаются неиспользуемыми после декларация.

(вы можете поспорить, чем я мог бы просто объявить b во втором if заявление, в таком случае, просто представьте, что оно может быть в цикле где-то еще.)

13 ответов


почему? Не может быть никакого пути кода, ведущего к программе, назначающей 1 в b без объявления его первым.

вы правы, но компилятор этого не знает. Компилятор не выполняет код. Компилятор переводит только байт-код без оценки выражений.


переменные могут быть объявлены внутри условного оператора. Однако вы пытаетесь получить доступ b в другой области.

когда вы объявляете b здесь:

if(a == 1) {
    int b = 0;
}

это только в области до конца }.

поэтому, когда вы подходите к этой строке:

b = 1;

b не существует.


этой { } определяет область действия блока. Все, что объявлено между {} локальная для этого блока. Это означает, что вы не можете использовать их вне блока. Однако Java запрещает скрывать имя во внешнем блоке именем во внутреннем. Это JLS говорит :

область объявления локальной переменной в блоке (§14.2) - это остальная часть блока, в котором появляется объявление, начиная с его собственного инициализатора (§14.4) и включая любой далее деклараторы справа в операторе объявления локальной переменной.

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


его все о области видимости переменных java.

вам нужно будет определить variable вне if statement чтобы иметь возможность использовать его снаружи.

int a = 0;
int b = 0;

if(a == 1) {
    b = 1;
}

if(a == 1) {
    b = 2;
}

посмотреть блоки и заявления


это локальная переменная и ограничена областью {}.

попробуй такое здесь.


вы объявили переменную b внутри блока if, который недоступен снаружи блока if, и если вы хотите получить доступ, то поместите снаружи, если блок


область b-это блок, в котором он объявлен, то есть первый if. Почему это так? Потому что это правило (лексическое) легко понять, легко реализовать и следует принципу наименьшего удивления.

Если бы b было видно во втором if:

  • компилятор должен был бы вывести эквивалент, если ветви и объединить их в одну область (трудно реализовать);
  • изменение условия в случайном операторе if потенциально сделать некоторые переменные видимыми, а другие скрытыми (трудно понять и источник удивительных ошибок).

ни один здравомыслящий язык не имеет такого сложного правила определения области.

w.r.т. производительность-объявление дополнительной переменной оказывает незначительное влияние на производительность. Доверьтесь компилятору! Он будет эффективно распределять регистры.


потому что, когда b выходит из области видимости в первом if (a == 1), то он будет удален и больше не существует в стеке и, следовательно, не может использоваться в следующем if оператор.


{ } используется для определения области действия переменных.И тут вы заявили:

if(a == 1) 
{
    int b = 0;
}

так что здесь область b будет только в { }.Таким образом, вы используете переменную B вне { }, это дает ошибку компиляции.

вы также можете сослаться на это:

http://docs.oracle.com/javase/tutorial/java/javaOO/variables.html


Если вы объявляете переменную внутри блока, то ограничение переменной ограничивает конкретный блок, в котором она была объявлена.

Примечание: только статические переменные имеют доступ из любой точки программы.

в код :

int a = 0;

if(a == 1) {
    int b = 0;
}

if(a == 1) {
    b = 1;
}

переменная " a "может быть доступна в любом операторе if как его объявление вне блока, но переменная" b " объявляется внутри, если, следовательно, ограничено ее использование вне блока.

Если вы хотите использовать 'B' вне оператора if вы должны объявить его там, где у вас есть переменная declare 'a'.


int a = 0;

if(a == 1) {
int b = 0; // this int b is only visible within this if statement only(Scope)
}

if(a == 1) {
b = 1; // here b can't be identify
}

вы должны сделать следующий способ, чтобы исправить ошибку

    int a = 0;
    int b = 0;
    if(a == 1) {
       b=0;
    }
    if(a == 1) {
        b = 1;
    }

просто для полноты: это тоже работает (объяснение является областью, см. другие ответы)

int a = 0;

if(a == 1) {
    int b = 0;
}

if(a == 1) {
    int b = 1;
}

из-за области видимости b будет доступен только внутри операторов if. То, что мы имеем здесь на самом деле два переменные, каждая из которых доступна только в своей области.


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

int a = 0;

if(a == 1) {
   int b = 0;    
} //b scope ends here

if(a == 1) {
    b = 1; //compiler error
}