2015-04-12 1 views
1

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

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

  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; 
       } 

enter image description here

+2

Существует не 'break;' for' "Locked" case. –

+3

Несвязанные, но, пожалуйста, рассмотрите рефакторинг или три. –

+0

Каково ваше ожидаемое поведение? –

ответ

4

Вам необходимо

break; 
case "Unlocked": 

, чтобы остановить «fall through»

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

+0

Ahh, имеет смысл в рефакторинге - спасибо за головы !! – runelynx

1

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

От Docs

В перерыве заявление необходимо, потому что без них, заявления в распределительных блоках проваливается: Всех заявлений после случая согласования этикеток выполняемые в последовательности, независимо от выражения последующие этикетки для футляров

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) 
     [...] 

Смотрите также this для объяснения switchзаявления от падения через.

Смежные вопросы