0

我最近在一些 java 代码中看到了以下模式。有人可以向我解释吗?这个for循环是什么意思?

for (;;) {
    try {
        // do something     
    } catch (Exception e) {
        if (e instanceof SomeException) {
            break;
        }
    }    
}
4

5 回答 5

3

这将形成一个无限循环,因此您需要休息一下才能摆脱它。

于 2013-10-10T23:39:42.153 回答
0

tldr; for(;;) {..}语义上等价于while(true) {..}


如果没有“结束条件”,则for循环永远......或直到breakreturn或传播异常或 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)
    }    
}
于 2013-10-10T23:40:09.980 回答
0

如果没有“break”语句,该循环将无限循环。无论退出条件是什么,“break”语句都会留下一个循环。

您在那里的代码块将继续在“Try”块中执行此操作,直到抛出 SomeException。一旦抛出 SomeException,循环将退出。检查是否抛出 SomeException 不能在循环的声明中完成,因此循环被告知永远循环。然后在循环体中指定循环结束的条件。

于 2013-10-10T23:40:28.920 回答
0

这相当于这样的事情:

 while(true) {
     try {
         // Do something
     } catch(Exception e) {
         if(someCondition)
             break;
     }
 }

循环将一直运行,直到它被异常处理程序明确中断。

请注意,如果从未设置为,则此(和您的for(;;))将永远运行。someConditiontrue

如果您坚持做这个无限循环,我会将其修改为:

boolean terminateLoop = false;
while(true) { // for(;;) {
    try {
        // Do something
        if(someTerminationCondition)
            terminateLoop = true;
    } catch(Exception e) {
        if(someCondition)
            break;
    } finally {
        if(terminateLoop)
            break;
    }
}

笔记。我不会在任何现实世界的算法中使用它......这只是避免无限循环的“理论”解决方案。

for循环旨在根据变量的特定增量(或减量)来执行操作......我喜欢将其称为“确定性”循环(我不太确定它是否是一个合适的名称)。如果您需要做的任何事情都不能让您使用变量的特定增量(或减量)作为中断条件,我认为您应该考虑使用whileordo... while循环(我喜欢称之为“非确定性”循环) .

于 2013-10-10T23:53:40.543 回答
0

如果意味着它将不断循环并执行“//do something”中所述的操作,直到抛出“SomeException”的实例,在这种情况下循环将终止。

它们通常用于网络套接字编程,当应用程序正在侦听端口时,如果出现错误则终止。

解释

它是一个无限循环,或类似于“while(true)”循环语句。

'for' 循环定义为

for([variable declaration]; [ending condition]; [action to do at the end of each loop]){...}

如您所见,使用 'for(;;)' 没有指定结束条件,它会永远循环。在满足某些条件时,必须在此类循环中使用“中断”以防止无限循环。

除非绝对必要,否则我个人不喜欢过多使用它们。虽然没有明显的性能劣势(请参阅为什么非预期的无限循环会增加 CPU 使用率?),但在更改无限 for 循环内的代码时必须非常小心,因此它最终会以 'break 退出'。

于 2013-10-11T00:22:49.787 回答