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 .
为了得到你可能寻找的行为,结束每个case有break:
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块内的执行,但它也结束了整个方法的执行.