请说明标签声明的用法

问题描述 投票:8回答:3
  • 是否正在打破并继续使用Java中标记语句的唯一用法?
  • 您何时在程序中使用标签语句?

对不起,代码段已被删除。我正在拆分问题

java break continue labeled-statements
3个回答
17
投票

JLS 14.7 Labeled statements

(为清楚起见编辑)

Statement可能带有标签前缀(IdentifierStatement)。声明Identifier为直接包含的Statement的标签。

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

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

严格来说,breakcontinue,带或不带标签,都是从不。它们总是可以用代码写出来。但是,惯用语言会导致代码更具可读性。


这是一个示例,给定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:上的循环(此处需要标签is;否则为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的另一种情况,不是在迭代语句中使用,而是在简单的block语句中使用。有人可能会说标签带来更好的可读性。这是主观的。

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


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标签时,您将跳过内循环和外循环的其余部分,包括打印语句。


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;
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.