[英]Java label? Outer, middle, inner
请不要担心循环,但我的问题是关于那些关键字: outer
, middle
和inner
。它们不被声明为实例变量,为什么IDE让代码编译? 我在google上做了一些搜索,是这个java标签吗? Java中的某种关键字? 多谢你们。
public class LoopTest{
public static void main(String[] args){
int counter = 0;
outer:
for(int i = 0; i < 3; i++){
middle:
for(int j = 0; j < 3; j++){
inner:
for(int k = 0; k < 3; k++){{
}
if(k - j > 0){
break middle;
}
counter++;
}
}
}
System.out.println(counter);
}
}
Java支持标签。 Oracle的这篇文章对此进行了描述。
所以,基本上你可以有带标签的循环,你可以使用关键字continue
, break
等来控制循环的流程。
以下示例说明了如何将循环与break
关键字一起使用。 当调用break
,它终止标记语句,即someLabel
的语句
someLabel:
for (i = 0; i < 100; i++) {
for (j = 0; j < 100; j++) {
if (i % 20 == 0) {
break someLabel;
}
}
}
continue
关键字以相同的方式处理标签。 当你调用例如continue someLabel;
外循环将继续。
根据这个SO问题,你也可以做这样的结构:
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();
就个人而言,我绝不会建议使用标签 。 相反,如果您重新排列代码以便不需要标签(例如,将复杂代码分解为更小的函数),我发现代码更容易理解。
在Java早期,有一个goto
运算符。 有一天, 詹姆斯戈斯林决定将其删除 。 但是,事实证明,仍允许你在循环中使用goto
。 那怎么做? 好吧,使用命名循环(也称为标记循环),您可以拥有突破循环的所有好东西,而不会受到goto
的意大利面条代码的缺点。
所以命名循环变成了一个东西,并且允许break
和continue
断开或继续循环而不是它们的直接父级。
是的,这些是带标签的语句 ,如Java Langage规范,Java SE 8 Edition, 第14.7节中所述 :
LabeledStatement:
Identifier : Statement
LabeledStatementNoShortIf:
Identifier : StatementNoShortIf
标识符被声明为直接包含的Statement的标签。
与C和C ++不同,Java编程语言没有goto语句; 标识符语句标签与出现在标记语句中任何位置的break或continue语句(第14.15节,第14.16节)一起使用。
标签声明的标签范围是立即包含的声明。
如果标签语句的标签名称在标签范围内用作另一个带标签语句的标签,则为编译时错误。
使用相同的标识符作为标签以及包,类,接口,方法,字段,参数或局部变量的名称没有限制。 使用标识符标记语句不会模糊(第6.4.2节)具有相同名称的包,类,接口,方法,字段,参数或局部变量。 使用标识符作为类,接口,方法,字段,局部变量或作为异常处理程序的参数(第14.20节)不会模糊具有相同名称的语句标签。
标记语句通过执行立即包含的Statement来执行。
如果语句由标识符标记,并且由于中断了相同的标识符而包含的语句突然完成,则标记的语句正常完成。 在突然完成声明的所有其他情况下,标签声明因同样的原因突然完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.