关于java:循环中断在字符串数组的switch块内不起作用

loop break not working inside switch block on array of strings

本问题已经有最佳答案,请猛点这里访问。

请参阅下面的代码,其中循环中断在开关块内不起作用,您能帮忙吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
    String Books[] = {"Harry Potter","To Kill a Mocking Bird","Hunger Games" };

    //For loop is not breaking after getting the correct value
    for (int t = 0; t < Books.length; t++) {
      switch (Books[t]) {
        case"Harry Potter":
             System.out.println("Getting from switch case" + t +"" + Books[t]);
            break;
        default:
            System.out.println("Invalid search for book from switch case");
            break;
        }
    }


当在switch语句中使用时,break只中断开关流,而不中断for循环,因此如果要中断for循环,在找到正确的值时使用return,该值将break循环并从方法返回,如下所示:

1
2
3
4
5
6
7
8
9
10
11
String Books[] = {"Harry Potter","To Kill a Mocking Bird","Hunger Games" };
    for (int t = 0; t < Books.length; t++) {
      switch (Books[t]) {
        case"Harry Potter":
             System.out.println("Getting from switch case" + t +"" + Books[t]);
            return;//use return when CORRECT CONDITION is found
        default:
            System.out.println("Invalid search for book from switch case");
            break;
        }
    }

简单地说,您的break将应用于内部代码块,它在这里是一个switch,因此它不是breakfor循环。因此,如果您想同时使用switchfor两个switchfor,请使用return语句,以便它从方法返回。

一个重要的点是不要在代码中使用标签(在行之间跳转),这与结构化编程相反。

选项(2):

如果不想从方法中删除return,则需要重构代码,并将寻书逻辑移动到单独的方法中,如checkBookExists,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
private boolean checkBookExists(String book, int t) {
      boolean bookFound = false;
      switch (book) {
        case"Harry Potter":
            bookFound = true;
            System.out.println("Getting from switch case" + t +"" + book);
            break;
        default:
            System.out.println("Invalid search for book from switch case");
            break;
        }
        return bookFound;
   }

现在调用for循环中的checkBookExists方法,如下所示,当找到书时,forbreak调用。

1
2
3
4
5
6
String Books[] = {"Harry Potter","To Kill a Mocking Bird","Hunger Games" };
    for (int t = 0; t < Books.length; t++) {
        if(checkBookExists(Books[t], t)) {
            break;
        }
    }


好吧,这个中断只会从switch语句中断。您可以尝试使用带标签的中断,例如

1
2
3
4
5
6
loop:
for (int t = 0; t < Books.length; t++ ) {
    // ...
    case:
        // ...
        break loop;

或者,您可以将循环放入它自己的方法中,并使用返回语句。