在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 。 我尝试将构建器更改为缓冲区,但我得到了相同的响应……这可能是一个错误还是我犯了一些错误?

这是你的代码中的一个错误。 你忘了在每个casebreak

 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; 声明获得相同的行为。