Область переменной в корпусе коммутатора

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

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

Код 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, поэтому она не является ошибка во втором случае.