请解释标签语句的用法

时间:2010-04-25 23:46:47

标签: java break continue labeled-statements

  • 是否打破并继续使用Java中标记语句的唯一用途?
  • 您何时在程序中使用了Labeled Statements?

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

3 个答案:

答案 0 :(得分:17)

JLS 14.7 Labeled statements

(为清晰起见而编辑)

  

语句可能包含标签前缀(标识符语句)。 标识符被声明为立即包含的语句的标签。

     

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

因此,JLS清楚标签与breakcontinue一起使用,并且Java编程语言的其他语法元素都不使用它。

严格地说,breakcontinue,无论是否标记, NEVER 都是必需的。它们总是可以写出代码。然而,在惯用语中,它们可以使代码更具可读性。


以下是一个说明性示例:给定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:上的后处理(此处不需要标签)
  • 标记break loop;用于终止default:上的循环(此处需要标签 ;否则为switch break

标记为break / continue的标签也可以在嵌套循环之外使用;当switch嵌套在循环中时,可以使用它。更一般地说,当有可能存在多个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的启发。不幸的是,这个谜题并没有更深入地“正确”使用标记语句。

答案 1 :(得分:6)

是的,breakcontinue是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语句。

答案 2 :(得分: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;
            }
        }
    }