在switch语句中,为什么所有的情况都被执行了?

Hel*_*Boy 10 java switch-statement

我有这个代码与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";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其更改为类似下面的内容,它会中断,因为除了case 1执行之外的所有情况:

  static String getOrdinal(final int day) {
    StringBuilder ordinalBuilder = new StringBuilder();
    ordinalBuilder.append("<sup>");
    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("</sup>");
   return ordinalBuilder.toString();
 }
Run Code Online (Sandbox Code Playgroud)

2<sup>ndrdth</sup>我传入时会打印出来2.我尝试将构建器更改为缓冲区,但我得到了相同的响应......这可能是一个错误还是我犯了一些错误?

Can*_*ice 44

这是你代码中的一个错误.你忘了break在每个之后加入case:

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;
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*d Z 22

我没有看到任何错误,至少不是语言的工作方式.根据switch设计,语句的行为是它将在case与参数匹配的标签处开始执行语句,然后继续执行直到块结束.所以

switch (x) {
    case 1:
        // do thing 1
    case 2:
        // do thing 2
    case 3:
        // do thing 3
    default:
        // do nothing
}
Run Code Online (Sandbox Code Playgroud)

如果x是2则会做2和3的事情,如果x是1 则会做1,2和3 .

为了得到你可能寻找的行为,结束每个casebreak:

switch (x) {
    case 1:
        // do thing 1
        break;
    case 2:
        // do thing 2
        break;
    case 3:
        // do thing 3
        break;
    default:
        // do nothing
        break;
}
Run Code Online (Sandbox Code Playgroud)

(严格来说,break最后是不必要的,但我经常把它放在习惯中).

你在第一个代码示例中没有遇到这个问题的原因return就像是super- break:它具有相同的效果break,即结束switch块内的执行,但它也结束了整个方法的执行.


jav*_*irl 9

你需要在每个开关案例中添加一个'break'语句.以前工作过,因为你从方法中返回了......


小智 6

休息;" 语句将案例彼此分开,因此为了在特定情况下执行语句,只要在结束时就破坏案例.

如果你不使用break,编译器会认为它可以继续执行直到程序结束的所有情况.