我最近在一些java代码中看到过以下模式。有人可以向我解释一下吗?这个for循环是什么意思?
for (;;) {
try {
// do something
} catch (Exception e) {
if (e instanceof SomeException) {
break;
}
}
}
答案 0 :(得分:3)
这会产生无限循环,所以你需要休息才能摆脱它。
答案 1 :(得分:0)
tldr; for(;;) {..}
在语义上等同于while(true) {..}
。
没有“结束条件”,for
将永远循环..或直到break
或return
或传播的异常或JVM终止。 (使用此类型的循环,相当于while(true) {..}
,for
的其他部分也会被省略,因为它们未被使用。)
在这种情况下,当且仅当捕获到某种类型的异常时,才会调用break
。否则,代码将保持循环,在可忽略某些类型的异常的情况下,它可以一次又一次地重试特定操作。 (这可能是一个“聪明的程序员”使用流控制异常的情况。)
注释:
// loop "forever" ..
for (;;) {
try {
// .. and perform some action ..
} catch (Exception e) {
if (e instanceof SomeException) {
// .. but terminate the loop on a certain exception ..
break;
}
// .. or otherwise loop again (even on an exception)
}
}
答案 2 :(得分:0)
如果没有“break”语句,该循环将无限循环。无论退出条件是什么,“break”语句都会留下一个循环。
你在那里的代码块将继续在“Try”块中执行操作,直到抛出SomeException。抛出SomeException后,循环将退出。检查是否抛出SomeException无法在循环声明中完成,因此循环被告知永远循环。然后在循环体内指定循环结束的条件。
答案 3 :(得分:0)
这相当于这样:
while(true) {
try {
// Do something
} catch(Exception e) {
if(someCondition)
break;
}
}
循环将一直运行,直到它被异常处理程序明确地破坏。
请注意,如果for(;;)
永远不会设置为someCondition
,则此{(以及您的true
)将永久运行。
如果你坚持做这个无限循环,我会把它修改为:
boolean terminateLoop = false;
while(true) { // for(;;) {
try {
// Do something
if(someTerminationCondition)
terminateLoop = true;
} catch(Exception e) {
if(someCondition)
break;
} finally {
if(terminateLoop)
break;
}
}
注意。我不会在任何现实世界的算法上使用它......它只是一个避免无限循环的“理论”解决方案。
for
循环是为了根据变量的特定增量(或减量)做事情...我喜欢称之为“确定性”循环(我不太确定它是否是一个适当的名称)。如果你需要做的事情没有给你一种方法来使用变量的特定增量(或减量)作为中断条件,我认为你应该考虑使用while
或do... while
循环(我喜欢称之为“非确定性”循环。)
答案 4 :(得分:0)
如果意味着它将连续循环并执行'// do something'中所述的操作,直到抛出'SomeException'的实例,在这种情况下循环将终止。
当应用程序正在侦听端口时,它们通常用于网络套接字编程,如果有错误则终止。
<强>释强>
它是一个无限循环,或类似于'while(true)'循环语句。
'for'循环定义为
for([variable declaration]; [ending condition]; [action to do at the end of each loop]){...}
正如您所看到的,使用'for(;;)'指定了无结束条件,它将永远循环。在这样的循环中,'break'是必须的,以便在满足某些条件时阻止无限循环。
就个人而言,除非绝对必要,否则我不喜欢使用它们。虽然没有明显的性能缺点(参见why does an infinite loop of the unintended kind increase the CPU use?),但在更改无限for循环内的代码时必须非常小心,因此它最终会以“break”退出。