Область видимости переменной в случае переключателя [дубликат]
этот вопрос уже есть ответ здесь:
Я думаю, что не понимаю, как область работает в случае коммутатора.
может кто-нибудь объяснить мне, почему первый код не компилируется, а второй ?
код 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 ответов:
Я повторю то, что говорили другие: область действия переменных в каждом
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 и if. В примере кода 1 фигурные скобки переключателя заключают оба объявления переменных, которые приведут к ошибке компилятора, поскольку привязка имени к переменной уже будет выполнена.
в другом примере это нормально, потому что обе переменные объявляются в свои фигурные скобки (рамки).