为什么我的while / switch做两次一个案例?

时间:2015-04-12 13:43:47

标签: java

出于某种原因,如果我的switch stmt的三种可能情况之一被触发,则执行两次。 3种可能性是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;
                }

enter image description here

3 个答案:

答案 0 :(得分:4)

你需要

    break;
case "Unlocked":

停止" fall through"

break是每个案例部分应该如何结束,除非您想要自动运行下一个案例部分。这是switch语句非常强大且常常令人困惑的特性。如果你让Dave Newton建议和重构,那么在你的代码中更容易发现和理解。考虑使用gone()方法创建lock()unlock()setStatus()方法甚至每个类。删除带有极端偏见的重复。

答案 1 :(得分:1)

Locked案例之后你没有休息一下。那么它正在执行下一个案例

来自Docs

  

中断语句是必要的,因为没有它们,语句   在开关块中通过:匹配大小写后的所有语句   标签按顺序执行,无论表达式如何   后续案例标签

答案 2 :(得分: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声明直通的说明。