![](/img/trans.png)
[英]why is the wrong “case” being executed after “default” in a switch statement
[英]In a switch statement, why are all the cases being executed?
我有这个代码和我从这篇文章中得到的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
之外的所有案例都将被执行:
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();
}
当我传入2
时,这会打印2<sup>ndrdth</sup>
。 我尝试将构建器更改为缓冲区,但我得到了相同的响应......这可能是一个错误还是我犯了一些错误?
这是您代码中的错误。 你忘了在每个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
}
将做两件事2和3,如果x
为2,并且将做的事情1,2,和3中,如果x
是1。
要获得您可能正在寻找的行为,请以break
结束每个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
块内的执行,但它也结束整个方法的执行。
您需要在每个 switch case 中添加一个“break”语句。 它以前有效,因为您从方法中返回...
休息;” 语句将案例彼此分开,因此为了在特定案例中执行语句,只需在案例结束时立即中断案例。
如果不使用 break 编译器认为它可以继续执行所有情况,直到程序结束。
第一个版本在继续执行 case 语句之前返回。 第二个版本需要休息一下; 语句以获得相同的行为。
幸运的是在 Java 12 上引入了switch 语句,它也引入了
“箭头案例”标签,无需使用 break 语句来防止掉线( source )。
因此,您的代码的现代版本如下所示:
String getOrdinal(final int day) {
if (day >= 11 && day <= 13) {
return "th";
}
return switch (day % 10) {
case 1 -> "st";
case 2 -> "nd";
case 3 -> "rd";
default -> "th";
};
}
我看到这个问题已经超过 8 年了,但是这个答案应该可以帮助任何登陆此页面的人。
首先让我们了解 switch case 是如何工作的。 在 C、C++、Java、JavaScript 和 PHP 中,在执行 switch 语句时,满足条件之后的所有情况都会被执行,这与 Go 中只执行选定的情况不同。 例如:
public class Main
{
public static void main(String[] args) {
int day = 11;
switch (day % 10) {
case 1: System.out.println("st");
case 2: System.out.println("nd");
case 3: System.out.println("rd");
default: System.out.println("th");
}
}
}
当前, day
值设置为 11,因此第一个案例满足条件,因此将执行以下所有案例。 输出应如下所示:
st
nd
rd
th
现在让我们将day
值更改为 13 导致第三种情况满足条件,因此获得以下输出:
rd
th
因此,如果您想在找到第一个令人满意的案例后打破代码,那么放置break;
最后的条件。 在问题return;
提到的代码中return;
做破坏代码的工作。
此外,大多数新手 Java 程序员认为 SWITCH 语句是 IF 语句的语法糖,程序员不必重复提及条件。 但事实并非如此,因为 IF 的目的是在满足条件执行后退出,而 SWITCH 仍继续执行。
可以利用开关盒来实现以下示例中提到的目的:
其中
A级“优秀!” 应该打印
对于 B 级和 C 级,应打印“做得好”
对于 D 级“你通过了\\n 下次努力”应该打印
对于 F 级,应打印“下次努力”
如果不是一个有效的案例,即发现等级,则应打印“无效等级”。
public class Test {
public static void main(String args[]) {
// char grade = args[0].charAt(0);
char grade = 'C';
switch(grade) {
case 'A' :
System.out.println("Excellent!");
break;
case 'B' :
case 'C' :
System.out.println("Well done");
break;
case 'D' :
System.out.println("You passed");
case 'F' :
System.out.println("Try hard next time");
break;
default :
System.out.println("Invalid grade");
}
System.out.println("Your grade is " + grade);
}
}
在每种情况下,在每一行的末尾添加一个 break 语句,或者只使用 return 语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.