为什么Java允许你打破当前的界限?

时间:2013-10-23 21:55:29

标签: java break

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

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

我可以理解为while添加标签,以便您可以提前结束,或者if,这样您就可以打破一个if而不是另一个,但为什么break?您何时需要break当前的break

经过测试,我发现label3: break label3;运行,但什么也没做,继续到下一行。 这是什么功能?

另请注意,Java不会让您破坏所有语句。例如,label: Object o = new Object();给出编译器错误,指出它不是一个语句,并且;是预期的,即使它确实运行Object的构造函数方法(并且,正如我们在Why does Java allow for labeled breaks on arbitrary statements?,Java允许您标记方法调用; label: new Object();编译就好了。

2 个答案:

答案 0 :(得分:2)

  

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

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

但在这种情况下,对于另外有用的构造,这是一个无用但无害的边缘情况。因为它没有真正的伤害,所以几乎没有必要禁止它。

确实,禁止会有害。删除此(无害)边缘情况的语言限制将:

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

  • 为编写java规范的人员提供额外的工作,

  • 为构建Java编译器的人群提供额外的工作。


  

Q2:目的是什么?

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

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

答案 1 :(得分:0)

JLS, Section 14.15

讨论break语句
  

没有标签的break语句尝试将控制转移到   最里面的封闭开关,while,do,或for语句   立即封闭方法或初始化器;这句话,是   称为中断目标,然后立即正常完成。

     

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

     

如果没有切换,while,do或for语句立即封闭   方法,构造函数或初始化程序包含break语句,a   发生编译时错误。

     

带有标签标识符的break语句尝试转移控件   到具有相同标签的封闭标签声明(第14.7节)   标识符作为其标签;这句话,叫做休息   目标,然后立即正常完成。在这种情况下,休息   目标不一定是开关,而是,做,或用于陈述。

     

确切地说,始终是带有标签标识符的break语句   突然完成,原因是标签标识符中断。

     

break语句必须引用立即的标签   封闭方法,构造函数或初始化程序。没有非本地的   跳跃。如果没有带标识符的标签语句作为其标签   立即封闭方法,构造函数或初始化程序包含   break语句,发生编译时错误。

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

并且break不会突破if - 它必须是switchwhiledo或{{1}根据上面的JLS。

for不起作用的原因是因为label: Object o = new Object();不是声明 - 它是一个声明。 JLS, Section 14.7谈到了这个问题:

  

标识符被声明为直接包含的Statement的标签。