我最近在一些 java 代码中看到了以下模式。有人可以向我解释吗?这个for循环是什么意思?
for (;;) {
try {
// do something
} catch (Exception e) {
if (e instanceof SomeException) {
break;
}
}
}
我最近在一些 java 代码中看到了以下模式。有人可以向我解释吗?这个for循环是什么意思?
for (;;) {
try {
// do something
} catch (Exception e) {
if (e instanceof SomeException) {
break;
}
}
}
这将形成一个无限循环,因此您需要休息一下才能摆脱它。
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)
}
}
如果没有“break”语句,该循环将无限循环。无论退出条件是什么,“break”语句都会留下一个循环。
您在那里的代码块将继续在“Try”块中执行此操作,直到抛出 SomeException。一旦抛出 SomeException,循环将退出。检查是否抛出 SomeException 不能在循环的声明中完成,因此循环被告知永远循环。然后在循环体中指定循环结束的条件。
这相当于这样的事情:
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
ordo... while
循环(我喜欢称之为“非确定性”循环) .
如果意味着它将不断循环并执行“//do something”中所述的操作,直到抛出“SomeException”的实例,在这种情况下循环将终止。
它们通常用于网络套接字编程,当应用程序正在侦听端口时,如果出现错误则终止。
解释
它是一个无限循环,或类似于“while(true)”循环语句。
'for' 循环定义为
for([variable declaration]; [ending condition]; [action to do at the end of each loop]){...}
如您所见,使用 'for(;;)' 没有指定结束条件,它会永远循环。在满足某些条件时,必须在此类循环中使用“中断”以防止无限循环。
除非绝对必要,否则我个人不喜欢过多使用它们。虽然没有明显的性能劣势(请参阅为什么非预期的无限循环会增加 CPU 使用率?),但在更改无限 for 循环内的代码时必须非常小心,因此它最终会以 'break 退出'。