Почему мой while / switch выполняет один случай дважды?

1

По какой-то причине, если один из трех возможных сценариев моего переключателя stmt запущен, он выполняется дважды. Три возможности: Gone, Unlocked, Locked. Если "Заблокировано" запущено, он запускает как "Заблокированные", так и "Разблокированные" пути.

Мой код ниже, и поведение приведено в скриншоте. Я не понимаю, как коммутатор оценивает значение? (Т.е. это "содержит", а не "равно" проверку?)

            while (graveData.next()) {

                switch(graveData.getString("Status")) {
                case "Gone":
                    new FancyMessage("ID").color(GRAY)
                    .then("" + graveData.getInt("ID")).color(AQUA)
                    .then(" ").color(GRAY)
                    .then(graveData.getString("Status"))
                    .color(GREEN).then(", Owner ").color(GRAY)
                    .then(graveData.getString("PlayerName"))
                    .color(YELLOW).then(", Looter ").color(GRAY)
                    .then(graveData.getString("LooterName"))
                    .color(YELLOW).then(", ").color(GRAY)
                    .then("Loc").color(GRAY)
                    .tooltip(graveData.getString("Location"))
                    .send(commandSender);
                    break;
                case "Locked":
                    new FancyMessage("ID").color(GRAY)
                    .then("" + graveData.getInt("ID")).color(AQUA)
                    .then(" ").color(GRAY)
                    .then(graveData.getString("Status"))
                    .color(YELLOW).then(", Owner ").color(GRAY)
                    .then(graveData.getString("PlayerName"))
                    .color(YELLOW).then(", ").color(GRAY)
                    .then("Loc").color(GRAY)
                    .tooltip(graveData.getString("Location"))
                    .send(commandSender);
                case "Unlocked":
                    new FancyMessage("ID").color(GRAY)
                    .then("" + graveData.getInt("ID")).color(AQUA)
                    .then(" ").color(GRAY)
                    .then(graveData.getString("Status"))
                    .color(RED).then(", Owner ").color(GRAY)
                    .then(graveData.getString("PlayerName"))
                    .color(YELLOW).then(", ").color(GRAY)
                    .then("Loc").color(GRAY)
                    .tooltip(graveData.getString("Location"))
                    .send(commandSender);
                    break;
                }

Изображение 174551

  • 2
    Там нет break; для "Запертого" случая.
  • 3
    Не связано, но, пожалуйста, рассмотрите рефакторинг или три.
Показать ещё 4 комментария
Теги:

3 ответа

4
Лучший ответ

тебе нужно

    break;
case "Unlocked":

чтобы остановить " провалиться ",

break - как каждый раздел должен заканчиваться, если вы не хотите автоматически запускать следующий. Это очень мощная и часто запутанная функция операторов switch. Один из них, который будет легче определить и понять в коде, если вы возьмете Dave Newtons за консультацию и рефакторинг. Рассмотреть возможность gone(), lock() и unlock() методы или даже классов, каждый с setStatus() метод. Удалите дублирование с крайним предрассудком.

  • 0
    Ааа, имеет смысл в рефакторинге - спасибо за заголовки !!
1

После второго case ("locked") вы забыли переложить break; выражение. Он должен выглядеть так:

case "Locked":
  new FancyMessage("ID").color(GRAY)
  .then("" + graveData.getInt("ID")).color(AQUA)

        [...]   

  .send(commandSender);
  break; //important !

case "Unlocked":
  new FancyMessage("ID").color(GRAY)
        [...]

См. Также это для объяснения ошибки switch.

1

Вы не сделали паузу после случая с Locked.. Так оно выполняет следующий случай

Из документов

Операторы break необходимы, потому что без них утверждения в блоках коммутатора проваливаются: все операторы после метки совпадения выполняются в последовательности, независимо от выражения последующих меток case

Сообщество Overcoder
Наверх
Меню