这段代码让我盯着屏幕看了几分钟:
loop:
for (;;) {
// ...
}
我之前从未见过这个,我不知道Java有一个“循环”关键字(NetBeans甚至没有像关键字那样对它进行着色),而且它可以用JDK 6编译得很好。
解释是什么?
答案 0 :(得分:192)
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;
}
}
}
答案 1 :(得分:72)
正如其他海报所说,它是一个标签,而不是一个关键词。使用标签可以执行以下操作:
outer: for(;;) {
inner: for(;;) {
break outer;
}
}
这允许打破外环。
答案 2 :(得分:31)
问题已得到解答,但作为旁注:
我听说过面试问题“为什么这个Java代码有效?” (剥离了一个更简单的例子;这里是较为简单的一个,蒂姆·比斯(TimBüthe)):
url: http://www.myserver.com/myfile.mp3
downLoad(url);
你们都知道这段代码是什么(除了可怕的)吗?
解决方案:两个标签url
和http
,注释www.myserver.com/myfile.mp3
以及带有与标签名称相同的参数(url
)的方法调用。是的,这个编译(如果你在别处定义方法调用和局部变量)。
答案 3 :(得分:16)
这不是关键字,而是标签。它意味着与嵌套循环中的break
和continue
关键字一起使用:
outer:
for(;;){
inner:
for(;;){
if(){
break inner; // ends inner loop
} else {
break outer; // ends outer loop
}
}
}
答案 4 :(得分:5)
这不是关键字;这是一个label。
它允许您使用带标签的break
并标记为continue
。
答案 5 :(得分:4)
它是一个断点标签,允许你突破指定的循环,而不仅仅是你碰巧在最里面的循环。
它在line 148上使用。
答案 6 :(得分:4)
这真是对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:”是他从不引用的标签。然后“//”使该行的其余部分成为评论。
答案 7 :(得分:2)
这是一个标签,但请看下面的例子:
int a = 0;
int b = 0
while (a<10){
firstLoop:
a++;
while(true){
b++
if(b>10){
break firstLoop;
}
}
}
当b>10
执行流程转到外部循环时。
答案 8 :(得分:2)
你几乎可以写任何东西,因为它是一个标签...... 您有一个示例here
答案 9 :(得分:1)
它是一个标签,Java中的标签可以与break
和continue
关键字一起使用,以进一步控制循环。
这里以相当不错的方式解释:
答案 10 :(得分:1)
它不是关键字,而是标签。如果在for
循环内写入break loop;
,则退出该循环。
答案 11 :(得分:0)
这是一个标签。通常是Java中用于在所需位置传输控制流的标签,而所有关键字(如continue和break)都具有指定的位置选择。