带有空语句的java for循环

时间:2013-10-10 23:37:54

标签: java

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

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

5 个答案:

答案 0 :(得分:3)

这会产生无限循环,所以你需要休息才能摆脱它。

答案 1 :(得分: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)
    }    
}

答案 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循环是为了根据变量的特定增量(或减量)做事情...我喜欢称之为“确定性”循环(我不太确定它是否是一个适当的名称)。如果你需要做的事情没有给你一种方法来使用变量的特定增量(或减量)作为中断条件,我认为你应该考虑使用whiledo... 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”退出。