简而言之,为什么允许这样做?
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();
编译就好了。
答案 0 :(得分:2)
Q1:为什么Java允许这样做?
与所有语言设计问题一样,获得明确答案的唯一方法是询问设计师。
但在这种情况下,对于另外有用的构造,这是一个无用但无害的边缘情况。因为它没有真正的伤害,所以几乎没有必要禁止它。
确实,禁止会有害。删除此(无害)边缘情况的语言限制将:
让那些正在构建生成 Java代码的工具的人更难,
为编写java规范的人员提供额外的工作,
为构建Java编译器的人群提供额外的工作。
Q2:目的是什么?
它没有本身的目的。声明label: break label;
没有任何用处。
但是没关系,还有很多其他的编写Java程序的方法,它们没有做任何有用的事情;例如if (true) { }
。
答案 1 :(得分:0)
break
语句
没有标签的break语句尝试将控制转移到 最里面的封闭开关,while,do,或for语句 立即封闭方法或初始化器;这句话,是 称为中断目标,然后立即正常完成。
准确地说,一个没有标签的break语句总是完成 突然之间,原因是没有标签的突破。
如果没有切换,while,do或for语句立即封闭 方法,构造函数或初始化程序包含break语句,a 发生编译时错误。
带有标签标识符的break语句尝试转移控件 到具有相同标签的封闭标签声明(第14.7节) 标识符作为其标签;这句话,叫做休息 目标,然后立即正常完成。在这种情况下,休息 目标不一定是开关,而是,做,或用于陈述。
确切地说,始终是带有标签标识符的break语句 突然完成,原因是标签标识符中断。
break语句必须引用立即的标签 封闭方法,构造函数或初始化程序。没有非本地的 跳跃。如果没有带标识符的标签语句作为其标签 立即封闭方法,构造函数或初始化程序包含 break语句,发生编译时错误。
没有任何内容表明break
中断的标签不能标记为当前块内的某些内容。你总是可以说break;
打破最里面的包含块。
并且break
不会突破if
- 它必须是switch
,while
,do
或{{1}根据上面的JLS。
for
不起作用的原因是因为label: Object o = new Object();
不是声明 - 它是一个声明。 JLS, Section 14.7谈到了这个问题:
标识符被声明为直接包含的Statement的标签。