2

简而言之,为什么允许这样做?

label1: while (condition)
label2:     if (condition)
label3:         break label3;

我可以理解标记 thewhile这样你就可以提前结束,或者if你可以打破一个if而不是另一个,但是为什么break呢?你什么时候需要break脱离当前break

测试后,我发现它label3: break label3;运行了,但什么也没做,继续下一行。这个有什么作用?

另请注意,Java 不允许您破坏所有语句。例如,label: Object o = new Object();给出编译器错误,指出它不是语句,并且 a;是预期的,即使它确实运行Object的构造函数方法(并且,正如我们在为什么 Java 允许在任意语句上标记中断?,Java 允许你标记方法调用;label: new Object();编译得很好)。

4

2 回答 2

2

Q1:为什么 Java 允许这样做?

与所有语言设计问题一样,获得明确答案的唯一方法是询问设计人员

但在这种情况下,这是一个无用但无害的边缘案例,在其他有用的构造上。由于它没有真正的危害,因此几乎没有必要禁止它。

确实,不允许这样做是有害的。消除这种(无害)边缘情况的语言限制将:

  • 让那些正在构建生成Java 代码的工具的人更难,

  • 为编写 Java 规范的那群人做额外的工作,并且

  • 为构建 Java 编译器的群体做额外的工作。


Q2:目的是什么?

它本身没有目的。该声明label: break label;没有任何用处。

但这没关系,还有很多其他编写 Java 程序的方法并没有做任何有用的事情。例如if (true) { }

于 2013-10-23T22:43:21.423 回答
0

JLS 第 14.15 节break讨论了该声明:

没有标签的 break 语句试图将控制转移到最里面的封闭式 switch、while、do 或 for 立即封闭方法或初始化程序的语句;此语句称为中断目标,然后立即正常完成。

准确地说,没有标签的 break 语句总是突然完成,原因是没有标签的 break。

如果直接封闭的方法、构造函数或初始化程序中没有 switch、while、do 或 for 语句包含 break 语句,则会发生编译时错误。

带有标签 Identifier 的 break 语句尝试将控制转移到封闭的带有标签的语句(第 14.7 节),该语句具有与其标签相同的 Identifier;此语句称为中断目标,然后立即正常完成。在这种情况下,break 目标不必是 switch、while、do 或 for 语句。

准确地说,带有标签标识符的中断语句总是突然完成,原因是带有标签标识符的中断。

break 语句必须引用直接封闭的方法、构造函数或初始化程序中的标签。没有非局部跳转。如果在直接封闭的方法、构造函数或初始化程序中没有以标识符作为其标签的标签语句包含 break 语句,则会发生编译时错误。

没有任何内容表明break不能将中断的标签标记为当前块内的某些内容。你总是可以说break;打破最里面的包含块。

并且break不会脱离-根据上面的 JLS,if它必须是switchwhiledo或。for

label: Object o = new Object();不起作用的原因是因为Object o = new Object();它不是一个声明——它是一个声明。JLS,第 14.7 节谈到了这一点:

标识符被声明为立即包含的语句的标签。

于 2013-10-23T22:02:30.693 回答