По какой-то причине, если один из трех возможных сценариев моего переключателя 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;
}
тебе нужно
break;
case "Unlocked":
чтобы остановить " провалиться ",
break
- как каждый раздел должен заканчиваться, если вы не хотите автоматически запускать следующий. Это очень мощная и часто запутанная функция операторов switch. Один из них, который будет легче определить и понять в коде, если вы возьмете Dave Newtons за консультацию и рефакторинг. Рассмотреть возможность gone()
, lock()
и unlock()
методы или даже классов, каждый с setStatus()
метод. Удалите дублирование с крайним предрассудком.
После второго 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
.
Вы не сделали паузу после случая с Locked
.. Так оно выполняет следующий случай
Из документов
Операторы break необходимы, потому что без них утверждения в блоках коммутатора проваливаются: все операторы после метки совпадения выполняются в последовательности, независимо от выражения последующих меток case
break;
для "Запертого" случая.