Java为什么允许在任意语句上使用带标签的中断?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java为什么允许在任意语句上使用带标签的中断?相关的知识,希望对你有一定的参考价值。

我今天才知道以下Java代码是完全合法的:

myBlock: 
    /* ... code ... */

    if (doneExecutingThisBlock())
        break myBlock;

    /* ... more code ... */

请注意,myBlock不是循环-只是我用花括号定界的代码块。

这似乎是一个非常奇怪的功能。这意味着您可以使用命名的break来打破if语句或匿名块,尽管在这些情况下通常不能使用break语句。

我的问题是:做出此设计决定的理由是否充分?也就是说,为什么要这样做,以便只能使用带标签的break而不是常规的break来打破某些封闭语句。 s?以及为什么要允许这种行为呢?考虑到设计良好的Java作为一种语言,相比之下,我认为这是有原因的,但老实说我想不出一种。

答案

为了简单起见,这样做是合理的。如果最初标记为break的语句只能破坏loop语句,那么语言设计人员应立即意识到该限制不是必需的,所有语句的语义均相同。考虑到语言规范的经济性以及更简单的编译器实现,或者只是出于不习惯通用的习惯,标记的break是为任何语句定义的,而不仅仅是循环语句。

现在我们可以回顾并判断这个选择。通过赋予程序员额外的表达能力,对程序员有好处吗?似乎很少,很少使用该功能。它会耗费程序员学习和理解的精力吗?如此讨论所证明的,似乎是这样。

如果您可以返回时间并进行更改,是吗?我不能说会。我们有一种普遍性的迷恋。

如果在并行世界中仅限于循环语句,那么仍有机会(可能更小)有人在stackoverflow上发布问题:为什么它不能在任意语句上起作用?

另一答案

将其视为从块而不是从整个函数返回的return语句。您对对象break分散在任何位置的理由也可以应用到return在函数末尾以外的任何地方。

另一答案

goto的问题在于它可以向前跳过去的代码。带标签的中断无法做到这一点(只能向后退)。 IIRC C ++必须处理goto跳过代码的问题(尽管我已经关注了17年,所以我不确定自己是否记得正确的代码)。

另一答案

为什么要这样做,所以您只能使用带标签的中断而不是常规的中断来突破某些封闭语句

另一答案

此设计决定是否有充分的理由?

另一答案

[添加到斯蒂芬C的答案中,if (something)您不能脱离嵌套循环。这些情况确实发生在数值算法中。这里有一个简单的示例-如果没有for,就无法突破i循环。希望这会有所帮助。

另一答案

这是等同于goto的“结构化”,在某些情况下有用。

另一答案

break语句终止带标签的语句;它不会将控制流转移到标签上。控制流紧接在标记(终止)的语句之后转移到该语句。

以上是关于Java为什么允许在任意语句上使用带标签的中断?的主要内容,如果未能解决你的问题,请参考以下文章

在任意位置编辑的基于文本的文件的高效设计?

使文本在任意背景图像上可读

带标签的 break 和 continue (Java)

Java5 全面认识java的控制流程

LLDB – 在任意对象的实例变量上设置观察点

Flutter如何在任意孩子上使用boxShadow?