2010-10-08 4 views
71

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

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

Код 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; 
} 

Каким образом объем переменной "ул" не содержится в случае 1?

Если я пропускаю декларацию случае 1 переменных «ули» никогда не объявлен ...

ответ

137

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

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

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

+6

Слушайте этого парня. Он прав. – John

+21

Правильно. Но я был бы очень доволен любым программистом в моей команде, который использует этот «синтаксис» без ОЧЕНЬ хорошей причины. Это рецепт путаницы и ошибок. Он визуально скрывает тот факт, что первый блок case (если он не был для 'return')« продолжается »даже после закрытия скобки - и помогает забыть« break ». – leonbloy

+2

также: используйте 'break' для обслуживания и предотвращения ошибок! даже если это не требуется. – worenga

9

Объем переменного всего 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; 
} 
0

Несколько случаев могут быть выполнены в одном переключателя заявлении. Итак ..

0

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

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

8

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

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

0

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

2

Я думаю, что это правильный вопрос, и предположение о сфере применения для случая неизбежно. Корректировка себя, потому что автор java сделал это не правильно.

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

Смежные вопросы