在switch语句中,为什么所有的情况都被执行?
我有这个代码与我在这篇文章中得到的switch
语句,它的工作原理非常好:
String getOrdinal(final int day) { if (day >= 11 && day <= 13) { return "th"; } switch (day % 10) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th"; } }
但是,如果我将其更改为类似下面的内容,它会中断,因为case 1
之外的所有case 1
都会被执行:
static String getOrdinal(final int day) { StringBuilder ordinalBuilder = new StringBuilder(); ordinalBuilder.append(""); if (day >= 11 && day <= 13) { ordinalBuilder.append("th") ; } switch (day % 10) { case 1: ordinalBuilder.append("st"); case 2: ordinalBuilder.append("nd"); case 3: ordinalBuilder.append("rd"); default: ordinalBuilder.append("th"); } ordinalBuilder.append(""); return ordinalBuilder.toString(); }
当我传入2
时,这会打印2ndrdth
。 我尝试将构建器更改为缓冲区,但我得到了相同的响应……这可能是一个错误还是我犯了一些错误?
这是你的代码中的一个错误。 你忘了在每个case
后break
:
switch (day % 10) { case 1: ordinalBuilder.append("st"); break; case 2: ordinalBuilder.append("nd"); break; case 3: ordinalBuilder.append("rd"); break; default: ordinalBuilder.append("th"); break; }
我没有看到任何错误,至少不是语言的工作方式。 根据设计, switch
语句的行为是它将在case
标签处开始执行与参数匹配的语句,然后继续执行直到块结束。 所以
switch (x) { case 1: // do thing 1 case 2: // do thing 2 case 3: // do thing 3 default: // do nothing }
如果x
是2,则将执行2和3两项,如果x
为1,将执行1,2和3。
要获得您可能正在寻找的行为,请结束每个case
:
switch (x) { case 1: // do thing 1 break; case 2: // do thing 2 break; case 3: // do thing 3 break; default: // do nothing break; }
(严格来说,最后的break
是不必要的,但我经常把它放在习惯之外)。
你在第一个代码示例中没有遇到这个问题的原因是return
就像一个超级break
:它具有与break
相同的效果,即在switch
块中结束执行,但它也结束了整个方法的执行。
你需要在每个开关案例中添加一个’break’语句。 以前工作过,因为你从方法中返回了……
rest;” 语句将案例彼此分开,因此为了在特定情况下执行语句,只要在结束时就破坏案例。
如果你不使用break,编译器会认为它可以继续执行直到程序结束的所有情况。
第一个版本在继续执行case语句之前返回。 第二个版本需要rest; 声明获得相同的行为。