Область видимости переменной в случае переключателя [дубликат]


этот вопрос уже есть ответ здесь:

Я думаю, что не понимаю, как область работает в случае коммутатора.

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

код 1 :

 int key = 2;
 switch (key) {
 case 1:
      String str = "1";
      return str;
 case 2:
      String str = "2"; // duplicate declaration of "str" according to Eclipse.
      return str;
 }

код 2 :

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }

почему область действия переменной " str " не содержится в случае 1 ?

Если я пропускаю объявление случая 1, переменная " str " никогда не объявляется...

7 79

7 ответов:

Я повторю то, что говорили другие: область действия переменных в каждом case предложение соответствует целому switch заявление. Однако можно создать дополнительные вложенные области с фигурными скобками следующим образом:

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}

полученный код теперь будет успешно компилироваться с переменной с именем str в каждом элементе case пункт в своей собственной области.

область действия переменной-это целое switch оператор -- все случаи и по умолчанию, если включены.

вот некоторые другие варианты...

Вариант 1:

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}

Вариант 2:

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}

вы, кажется, предполагаете, что каждый case - Это блок со своей собственной локальной областью видимости, как если бы / else блоки. Это не так.

важно исправить эту концептуальную ошибку, потому что в противном случае вы закончите попадать в частую ловушку забывания break внутри case

Я думаю, что это правильный вопрос, и предположение о масштабах для Case statment неизбежно. Приспосабливаясь к нему, потому что java writer сделал это не правильно.

например, если оператор по умолчанию занимает первую строку в своей области, чем то, что не так в случаях, когда конец case явно закрыт оператором break. Следовательно, объявление в случае 1: не должно быть доступно в случае 2, и оно имеет параллельную область, но не вложено.

несколько случаев могут быть выполнены в одном операторе switch. Так..

область действия переменной существует между фигурными скобками операторов switch и if. В примере кода 1 фигурные скобки переключателя заключают оба объявления переменных, которые приведут к ошибке компилятора, поскольку привязка имени к переменной уже будет выполнена.

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

в первом случае область объявления строки находится в операторе switch, поэтому она отображается как дубликат, а во втором строка заключена в фигурные скобки,которые ограничивают область в условиях if/else, поэтому во втором случае это не ошибка.