8
  • 打破并继续 Java 中标记语句的唯一用途?
  • 你什么时候在你的程序中使用过标签语句?

抱歉,代码片段已被删除。我正在拆分问题

4

3 回答 3

20

JLS 14.7 标记语句

(为清楚起见进行了编辑)

语句可能有标签前缀(Identifier : Statement)。Identifier被声明为立即包含的Statement的标签。

与 C 和 C++ 不同,Java 编程语言没有goto语句;标识符语句标签与出现在标记语句中的任何位置的break( §14.15 ) 或continue( §14.16 ) 语句一起使用。

所以 JLS 很清楚标签与breakor一起使用continue,Java 编程语言的其他语法元素都没有使用它。

严格来说,breakand continue,无论是否标记,都不是必需的。它们总是可以从代码中写出来。然而,习惯性地使用它们可以产生更具可读性的代码。


这是一个说明性示例:给定一个int[],我们想要:

  • 打印"One (1)"1
  • 打印"Two (2)"2
  • 打印"Zero "0
  • 立即停止处理任何其他号码

    int[] arr = { 1, 2, 0, 1, -1, 0, 2 };
    loop:
    for (int num : arr) {
        switch (num) {
        case 1:
            System.out.print("One ");
            break;
        case 2:
            System.out.print("Two ");
            break;
        case 0:
            System.out.print("Zero ");
            continue loop;
        default:
            break loop;
        }
        System.out.print("(" + num + ") ");
    }
    // prints "One (1) Two (2) Zero One (1) "
    

在这里我们看到:

  • 不同的数字在一个switch
  • break中的未标记switch用于避免案例之间的“失败”
  • 标签continue loop;用于跳过后处理case 0:(此处不需要标签)
  • Labeledbreak loop;用于终止循环default:(此处需要标签;否则为aswitch break

所以标记break/continue也可以在嵌套循环之外使用;它可以在 aswitch嵌套在循环中时使用。更一般地说,它在可能有多个break/continue目标时使用,并且您想选择一个不立即包含break/continue语句的目标。


这是另一个例子:

    morningRoutine: {
        phase1: eatBreakfast();
        if (grumpy) break morningRoutine;
        phase2: kissWife();
        phase3: hugChildren();
    }
    http://stackoverflow.com is the best website ever!

这是另一个没有在迭代语句中使用标签的情况break,而是在简单的块语句中使用。有人可能会争辩说,标签会带来更好的可读性;这一点是主观的。

不,最后一行不会给出编译时错误。它实际上是受到Java Puzzlers Puzzle 22: Dupe of URL 的启发。不幸的是,这个谜题并没有更深入地“正确”使用带标签的语句。

于 2010-04-26T02:30:06.537 回答
6

是的,break并且continue是 Java 中标记语句的唯一两种用途。(Java 没有goto声明。)

您可以使用标签来打破嵌套循环。

outer:
    for (int i = 0; i < 5; i++) {    
        for (int j = 0; j < 5; j++) {
            System.out.println("Hello");
            continue outer;
        } // end of inner loop
        System.out.println("outer"); // Never prints
    }
System.out.println("Good-Bye");

当您continue返回outer标签时,您将跳过内部和外部循环的其余部分,包括 print 语句。

于 2010-04-25T23:54:08.897 回答
3
search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }
于 2010-04-25T23:49:57.977 回答