出于某种原因,如果我的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;
}
答案 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
声明直通的说明。