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

IT小君   2021-10-12T01:30:34

我有这个代码和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<sup>ndrdth</sup>在我传入时打印2我尝试将构建器更改为缓冲区,但得到了相同的响应......这可能是一个错误还是我犯了一些错误?

评论(8)
IT小君

这是您代码中的错误。你忘了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;
}
2021-10-12T01:30:34   回复
IT小君

我在这里没有看到任何错误,至少在语言的工作方式中没有。根据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 件事,如果是 1,将做 1、2 和 3 件事x

为了得到你可能寻找的行为,结束每个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;
}

(严格来说,break最后是不必要的,但我经常出于习惯而将其放入)。

你在第一个代码示例中没有这个问题的原因是它return就像一个超级break:它与 具有相同的效果break,即在switch内结束执行,但它也结束整个方法的执行。

2021-10-12T01:30:34   回复
IT小君

您需要在每个 switch case 中添加一个“break”语句。它以前是有效的,因为您从方法中返回...

2021-10-12T01:30:34   回复
IT小君

休息;” 语句将案例彼此分开,因此为了在特定案例中执行语句,只需在案例结束时立即中断案例。

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

2021-10-12T01:30:34   回复
IT小君

第一个版本在继续执行 case 语句之前返回。第二个版本需要休息一下;语句以获得相同的行为。

2021-10-12T01:30:35   回复
IT小君

幸运的是在 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";
    };
}
2021-10-12T01:30:35   回复
IT小君

我看到这个问题已经超过 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 

现在让我们将dayvalue更改为 13 导致第三种情况满足条件,因此获得以下输出:

rd
th

因此,如果您想在找到第一个令人满意的案例后打破代码,那么将break;条件放在最后。在问题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);
   }
}
2021-10-12T01:30:35   回复
IT小君

在每种情况下,在每一行的末尾添加一个 break 语句,或者只使用 return 语句。

2021-10-12T01:30:35   回复