在java中使用标签而不使用“循环”

2022-09-04 01:03:13

我一直认为标签只能与循环一起使用,但似乎不是。给出这样的代码:

public class LabelTest {
    public static void main(String[] args) {
        label1: System.out.println("");
        label2: LabelTest t = new LabelTest();  
    }                                               
}

当编译时,标记为“label1”的行编译,但“label2”处的代码会给出错误。这是为什么呢?为什么我要标记不是“循环”的语句?


答案 1

您会收到错误,因为标签不能应用于变量声明,这就是语言语法的定义方式(标签只能在 a 之前,而 a 不是 a)。原因可能是它可能导致有关变量范围的混淆。这有效:StatementLocalVariableDeclarationStatementStatement

    label1: System.out.println("");
    label2: { LabelTest t = new LabelTest(); }

答案 2

为了补充Michael Borgwardt的答案,为了方便起见,你可以做这样的事情(前几天我在阅读Java rt.jar源代码时刚刚发现了这一点):

BlockSegment:
if (conditionIsTrue) {
    doSomeProcessing ();
    if (resultOfProcessingIsFalse()) break BlockSegment;
    otherwiseDoSomeMoreProcessing();
    // These lines get skipped if the break statement
    // above gets executed
}
// This is where you resume execution after the break
anotherStatement();

现在,这在逻辑上等效于:

if (conditionIsTrue) {
    doSomeProcessing ();
    if (!resultOfProcessingIsFalse()) {
        otherwiseDoSomeMoreProcessing();
        // More code here that gets executed
    }
}
anotherStatement();

但是,您可以跳过一些额外的大括号(以及大括号附带的缩进)。也许它看起来更干净(在我看来确实如此),并且在某些地方,这种编码风格可能是合适的,并且不那么令人困惑。

因此,您可以使用超越循环的标签,甚至超越语句。例如,这是有效的Java语法(也许你可以想出一个理由来做这样的事情):if

statementOne();
statementTwo();
BlockLabel: {
    statementThree();
    boolean result = statementFour();
    if (!result) break BlockLabel;
    statementFive();
    statementSix();
}
statementSeven();

如果在此处执行,则执行将跳到标签所表示的块的末尾,并被跳过。breakstatementFive()statementSix()

这种样式(没有语句)的有用性在必须跳过的块内有块时变得更加明显。通常,您可以通过足够聪明地使用循环来完成所有事情。但是,在某些情况下,不带循环的标签可以更轻松地读取代码。例如,如果需要按顺序检查参数,则可以执行此操作或引发异常。它最终成为代码和个人风格的清洁度问题。if


推荐