2013-03-20 2 views
3

Почему я не могу создать переменные в каждом случае с тем же именем. Например, из кода ниже, в case 3, он будет жаловаться, что String name уже существует, но почему? Case 1 никогда не был и никогда не будет называться.Повторное копирование переменных в случае коммутатора

Я бы не хотел извлекать определения из switch-case. Итак, почему с помощью операторов if он позволяет определять одинаковые имена в каждом случае, но в switch-case это не так?

Вот простой Java код с корпусом переключателя:

int type = 3; 

switch (type) { 
    case 1: 
     String name = (String) respone.get("name"); 
     user.setName(name); 
     break; 
    case 2: 
     String surname = (String) respone.get("surname"); 
     user.setSurname(surname); 
     break; 
    case 3: 
     String name = (String) respone.get("name"); 
     user.clearName(name); 
     break; 
    default: 
     ... 
} 
+1

Ответ может быть «потому что». Я предполагаю, что это потому, что блоки 'case:' не являются действительно блоками в отношении компилятора - они имеют метки в одном блоке 'switch'. Таким образом, область локальных переменных - это блок переключателей. – millimoose

+0

Вы всегда можете поместить непосредственно casted '(String) respone.get (" foo ")' в вызываемую вами функцию ... – LaGrandMere

+0

Хороший вопрос, но уже много ответов, например дубликат: http: // stackoverflow. com/a/3894215/1081849 – sbk

ответ

7

Написать каждый случай заявление в другом блоке:

switch (type) { 
    case 1: { 
     String name = (String) respone.get("name"); 
     user.setName(name); 
     break; 
    } 
    case 2: { 
     String surname = (String) respone.get("surname"); 
     user.setSurname(surname); 
     break; 
    } 
    ... 
} 
+2

Ничего себе. Впервые увидел блоки в коммутаторе! Изучайте вещи каждый день! –

4

name уже существует, так как случаи концептуально в одном блоке. Случай: по существу ярлык, а оператор switch просто перескакивает на соответствующую метку. См. here for more info on labels in Java (не ограничивается switch заявлениями).

Чтобы увидеть это, представьте, если у вас не было операторов break. Вы можете инициализировать name в одном предложении case и перейти к следующему пункту. Приложите предложение каждого случая в отдельный блок {}, если это проблема.

0

Потому что, даже если они являются взаимоисключающими, они присутствуют в одном и том же блоке Switch. Следовательно, вы можете написать предложение каждого случая в отдельных блоках, чтобы избежать этой ошибки.

0

Имейте в виду, что case не ваша сфера, блоки являются { .. }

0

Весь переключатель содержится в одном блоке. Можно обернуть каждый случай в собственном блоке:

case 1: { 
    String name = (String) respone.get("name"); 
    user.setName(name); 
    break; 
    } 
case 2: { 
    String surname = (String) respone.get("surname"); 
    user.setSurname(surname); 
    break; 
    } 
case 3: { 
    String name = (String) respone.get("name"); 
    user.clearName(name); 
    break; 
    } 
0

Если вы объявляете переменную без скобок в коммутаторе, то его объем остается на протяжении коммутаторе.

Его независимо от того, где вы объявляете свой первый блок переключателя или второй. Если вы объявите его первым, тогда его можно будет получить после него через переключатель.

Если вы хотите иметь такое же имя переменной, вы можете сделать это, вставив фигурные скобки или блок, потому что тогда область переменных остается в пределах блока.

switch (type) { 
    case 1: { 
     String name = (String) respone.get("name"); 
     user.setName(name); 
     break; 
    } 
    case 2: { 
     String surname = (String) respone.get("surname"); 
     user.setSurname(surname); 
     break; 
    } 
    case 3: { 
     String name = (String) respone.get("name"); 
     user.clearName(name); 
     break; 
    } 
    default: 
     ... 
} 
Смежные вопросы