请解释标签语句的用法

unj*_*nj2 8 java continue break labeled-statements

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

很抱歉,代码段已被删除.我正在分裂这个问题

pol*_*nts 17

JLS 14.7标记语句

(为清晰起见编辑)

语句可能有标签前缀(标识符:语句).该标识符被声明为直接包含的标签声明.

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

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

严格来说,break并且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) "
    
    Run Code Online (Sandbox Code Playgroud)

在这里我们看到:

  • 不同的数字在a中处理 switch
  • 未标记breakswitch用于避免案件之间的"堕落"
  • Labeled continue loop;用于跳过后处理case 0:(此处不需要标签)
  • 将标记break loop;用于终止环路default:(标签必要这里,否则它是一个switch break)

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


这是另一个例子:

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

这是标记的另一种情况,break不是在迭代语句中使用,而是在简单的块语句中使用.有人可能会说这些标签会带来更好的可读性; 这一点是主观的.

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

  • 最后一行实际上确实按原样给出了编译器错误。如果您在它之后添加任何语句,它就会起作用,因为您必须标记某些东西才能使其有效。 (2认同)

Bil*_*ard 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");
Run Code Online (Sandbox Code Playgroud)

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