Я не вижу здесь никакой ошибки, по крайней мере, не в том, как работает язык. Поведение оператора switch
по своей конструкции заключается в том, что он начнет выполнять операторы с меткой case
, которая соответствует аргументу, а затем продолжится до конца блока. Так
switch (x) {
case 1:
// do thing 1
case 2:
// do thing 2
case 3:
// do thing 3
default:
// do nothing
}
будет делать обе вещи 2 и 3, если x
равно 2, и будет делать вещи 1, 2 и 3, если x
равно 1.
Чтобы получить поведение, которое вы, вероятно, ищете, заканчивайте каждый case
с break
:
switch (x) {
case 1:
// do thing 1
break;
case 2:
// do thing 2
break;
case 3:
// do thing 3
break;
default:
// do nothing
break;
}
(строго говоря, break
в самом конце не нужен, но я часто употребляю его по привычке).
Причина, по которой у вас не возникло этой проблемы в первом примере кода, заключается в том, что return
похож на супер- break
: он имеет тот же эффект, что и break
, а именно завершает выполнение в блоке switch
, но это также завершает выполнение всего метода.