Почему при переключении на java проверяется больше случаев, чем требуется?

Я уже искал в stackoverflow причины, касающиеся вопроса, почему переключатель не ломается после того, как нашел подходящий случай.

Например, я написал код, имитирующий игральные кости. Для каждого броска я считаю по статистическим причинам (one, ... = int).

switch (actualThrow) {
case (1): one++; 
case (2): two++; 
case (3): three++; 
case (4): four++;
case (5): five++; 
case (6): six++; 
}

Я ДЕЙСТВИТЕЛЬНО знаю, что case (3) -case (6) будет проверяться, если мой бросок был 3 (Зачем нам нужен break после case-операторов?), и это можно предотвратить, вставив break;, но я хочу понять , почему, очевидно, следующие случаи кажутся проверенными, но выполняются, хотя условие не выполняется.


person Gary Klasen    schedule 07.06.2013    source источник
comment
Различные случаи в переключателе проваливаются до тех пор, пока переключатель не закончится или не дойдет до разрыва. Проверка условий определяет только начальный случай.   -  person thegrinner    schedule 08.06.2013
comment
Итак, вы понимаете, что вам нужны breaks, но хотите знать, почему выполняются последующие дела? Простите, но я не понимаю вопроса.   -  person jerry    schedule 08.06.2013
comment
Я понимаю, что подпрограммы выполняются, поэтому мне нужно breaks. Я не понимаю, ПОЧЕМУ проверка не удалась.   -  person Gary Klasen    schedule 08.06.2013
comment
Потому что после перехода к соответствующему регистру проверки нет. Случаи - просто точки входа.   -  person Andy Thomas    schedule 08.06.2013
comment
Голосование для открытия. Ни в одном из ответов в дубликате не упоминается JLS, объясняющая, почему это так.   -  person Brian Roach    schedule 08.06.2013
comment
Он больше не проверяет и не дает сбоев. Он ищет первую метку, которая соответствует вашему actualThrow, и продолжает, пока не найдет конец оператора (для оператора switch) или break;. Это поведение, присвоенное оператору switch.   -  person BLaZuRE    schedule 08.06.2013
comment
Потому что (1): может быть значение по умолчанию, которое необходимо выполнить; (2): в блоке может быть более одного случая (например, случай 1: случай 2: случай 3: lowroll ++;); и (по умолчанию): это то, что есть.   -  person michael    schedule 08.06.2013
comment
@michael_n Я не согласен с частью (1) вашего комментария. Я не думаю, что провал просто потому, что может быть default: ярлык. Кроме того, оператор default: может быть размещен вверху, мы просто по соглашению помещаем его внизу.   -  person BLaZuRE    schedule 08.06.2013
comment
@BLaZuRE Я согласен с вами; Честно говоря, я не совсем понимаю, что на самом деле ищет спрашивающий, кроме как лучше понять, почему это именно так; то есть больше практических примеров, чем пояснения спецификации.   -  person michael    schedule 08.06.2013
comment
@BLaZuRE, основанный на принятом ответе, звучит так, как будто мой случай № 2 действительно нужен для прояснения ситуации.   -  person michael    schedule 08.06.2013


Ответы (2)


Представьте себе такой сценарий:

switch(trafficLight.state) {
    case GREEN:
        car.drive();
        break;
    case YELLOW:
        car.drive();
        break;
    case RED:
        car.stop();
        break;
}

Это выглядит расточительно, поскольку ЗЕЛЁНЫЙ и ЖЕЛТЫЙ делают одно и то же. Java позволяет нам консолидироваться, чтобы несколько условий выполняли одно и то же действие:

switch(trafficLight.state) {
    case GREEN:
    case YELLOW:
        // Now both GREEN and YELLOW will use this code
        car.drive();
        break;
    case RED:
        car.stop();
        break;
}

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

person Chris Eberle    schedule 07.06.2013
comment
Разве это не должно быть car.floorIt() для case YELLOW? - person splungebob; 08.06.2013
comment
Ах, теперь я понял. Спасибо! :) - person Gary Klasen; 08.06.2013

При синтаксическом разборе оператора switch-case каждый case - это просто метка. Если что-то соответствует регистру, оно будет выполняться до тех пор, пока не найдет разрыв или конец оператора (a }).

Он похож на код операции Java (по сути, ассемблерный код). Вы используете ярлыки для перехода. Кроме того, они на самом деле не служат цели в коде.

person BLaZuRE    schedule 07.06.2013