Answers:
它不是一个keyword
,而是一个label
。
用法:
label1:
for (; ; ) {
label2:
for (; ; ) {
if (condition1) {
// break outer loop
break label1;
}
if (condition2) {
// break inner loop
break label2;
}
if (condition3) {
// break inner loop
break;
}
}
}
文件资料。
该问题已得到回答,但请注意:
我听说过面试问题“为什么这个Java代码有效?” (摘录了更简单的示例;这是卑鄙的人,蒂姆·布特(TimBüthe)):
url: http://www.myserver.com/myfile.mp3
downLoad(url);
你们都知道这段代码是什么(除了糟糕的)?
解决方案:两个标签,url
和http
,注释www.myserver.com/myfile.mp3
和带有与url
标签同名()的参数的方法调用。是的,这会编译(如果您在其他地方定义了方法调用和局部变量)。
那不是关键字,而是标签。它应与嵌套循环内的break
and continue
关键字一起使用:
outer:
for(;;){
inner:
for(;;){
if(){
break inner; // ends inner loop
} else {
break outer; // ends outer loop
}
}
}
inner
标签在这里没用,break;
就足够了
inner
提供清晰的标签。
这实际上是对seanizer对org.life.java的回答的评论的答复,但是我想输入一些代码,因此无法使用评论功能。
虽然很少能找到“中断标签”的用法,但它确实偶尔发生。最常见的情况是,当我搜索的结构中需要嵌套循环进行搜索时,例如:
search:
for (State state : stateList)
{
for (City city : state.cityList)
{
if (city.zipcode.equals(wantZip))
{
doSomethingTo(city);
break search;
}
}
}
通常,在这种情况下,我会将整个东西压入一个子例程中,这样一经命中,我就可以返回找到的对象,如果它掉入了循环的底部,我可以返回null表示未找到,或者抛出异常。但这偶尔有用。
坦率地说,我认为Java的发明者包括了此功能,因为在此处理与异常处理之间,他们消除了GOTO的最后两个合法用途。
附录很晚:
我曾经看过一段很棒的代码行。程序员写道:
http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)
他实际上不是说“ example.com”,而是说我们公司的网站。
它给人的感觉是代码中有一个URL。它可以成功编译,就像执行某些操作一样。但是...它是做什么的?
实际上,它什么也不做。“ http:”是他从未引用过的标签。然后,“ //”使该行的其余部分成为注释。
这是一个标签,但请看以下示例:
int a = 0;
int b = 0
while (a<10){
firstLoop:
a++;
while(true){
b++
if(b>10){
break firstLoop;
}
}
}
当b>10
执行流程转到外循环时。