Область переменной в корпусе коммутатора
Я думаю, что не понимаю, как область действия работает в случае коммутатора.
Может кто-нибудь объяснить мне, почему первый код не компилируется, но второй делает?
Код 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" не содержится в Case 1?
Если я пропущу объявление случая 1, переменная "str" никогда не объявляется...
Ответы
Ответ 1
Я повторю то, что сказали другие: объем переменных в каждом предложении case
соответствует целому выражению switch
. Однако вы можете создать дополнительные вложенные области с фигурными скобками следующим образом:
int key = 2;
switch (key) {
case 1: {
String str = "1";
return str;
}
case 2: {
String str = "2";
return str;
}
}
Полученный код теперь будет успешно скомпилирован, так как переменная с именем str
в каждом предложении case
находится в своей области.
Ответ 2
Объем переменной - это весь оператор 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;
}
Ответ 3
Кажется, вы считаете, что каждый case
является блоком со своей локальной областью, как будто /else блокирует. Это не так.
Важно исправить эту концептуальную ошибку, потому что в противном случае вы прекратите падать в частую ловушку, забыв break
внутри case
Ответ 4
Я думаю, что это правильный вопрос, и предположение о сфере применения для случая не обязательно.
Приспосабливаясь к этому, потому что автор java сделал это не правильно.
например. если оператор по умолчанию принимает первую строку в своей области действия, чем то, что неправильно в случаях, когда конец case явно закрыт оператором break. Следовательно, декларация в случае 1: не должна быть доступна в случае 2 и имеет параллельный масштаб, но не вложен.
Ответ 5
В одном операторе switch может быть выполнено несколько случаев. Так..
Ответ 6
Область переменных существует между фигурными скобками переключателя и операторами if. В примере кода 1 скобки переключателя заключают в себе как декларации переменных, которые вызовут ошибку компилятора, поскольку имя для привязки переменной будет уже сделано.
В другом примере это нормально, потому что обе переменные объявлены в пределах своих собственных фигурных скобок (scope).
Ответ 7
В первом случае область действия объявления String находится внутри оператора switch, поэтому она отображается как повторяющаяся, а во второй строка заключена в фигурные скобки, которая ограничивает область действия if/else, поэтому она не является ошибка во втором случае.