Переключатель Java: объявление переменной и область видимости

Как компилятор Java обрабатывает следующий блок переключателей? Какова сфера действия «b»? переменная?

Обратите внимание, что "b" переменная объявляется только в первой ветви оператора switch. Попытка объявить его во второй ветви также приводит к «дублированной локальной переменной»; ошибка компиляции.

    int a = 3;
    switch( a ) {
    case 0:
        int b = 1;
        System.out.println("case 0: b = " + b);
        break;
    case 1:
        // the following line does not compile: b may not have been initialized
        // System.out.println("case 1 before: b = " + b);
        b = 2;
        System.out.println("case 1 after: b = " + b);
        break;
    default:
        b = 7;
        System.out.println("default: b = " + b);
    }

Примечание: приведенный выше код компилируется с помощью компилятора Java 1.6.

Ответы на вопрос(7)

Вы можете определить область, используя {} вокруг вашего случая.

int a = 3;
switch( a ) {
case 0: {
    int b = 1;
    System.out.println("case 0: b = " + b);
    break;
}
case 1: {
    // the following line does not compile: b may not have been initialized
    // System.out.println("case 1 before: b = " + b);
    int b = 2;
    System.out.println("case 1 after: b = " + b);
    break;
}
default: {
    int b = 7;
    System.out.println("default: b = " + b);
}
}

Область переменных, определенных вswitch() утверждение будет таким же, как в нормальном блоке, который окружен{ а также}.

Поэтому каждая переменная, определенная вswitch() Оператор виден для всего блока, как только он определен.

Сфераb блок переключателя - между объявлением и разделителем} -

int a = 3;

switch( a ) {
     case 0:
          int b = 1; //scope starts
          System.out.println("case 0: b = " + b);
          break;
     case 1:
          // the following line does not compile: b may not have been initialized
          // System.out.println("case 1 before: b = " + b);
          b = 2;
          System.out.println("case 1 after: b = " + b);
          break;
     default:
          b = 7;
          System.out.println("default: b = " + b);
}//scope ends

Тем не менее, вы должны знать, что если вы объявитеint b внутриcase 1:, вы не будете иметь доступ к переменнойb внутриcase 0:

Чтобы ответить на вопрос, который вы задаете в комментариях Java, вы можете проверить этот более простой пример:

int b;
if(true){
    b++; //The local variable b hast not been initialized
}

Надеюсь, поможет.

в вашем коде, если a не равно 0, b никогда не будет инициализирован. Вы должны определить b перед оператором switch.

Вашcase блоки не имеют локальной области видимости. Это не серияif...else if...else блоки, Java реализует его как сериюGOTOs.

Сфераb это блок. У вас есть только один блок, который включает в себя всеcases. Вот почему вы получаете ошибку компиляции при переопределенииb во второйcase.

Вы можете обернуть каждыйcase в собственном блоке, как

case 0:
   {
     int b = 1;
     ...
   }
case 1:
   {
     int b = 2;
     ...
   }

но я думаю, что FindBugs или CheckStyle будут жаловаться на это.

Решение Вопроса

Область действия, как обычно, ограничена{ а также}.

Ваш ответ на вопрос