2013-10-10 99 views
0

最近我在一些java代碼中看到了以下模式。有人可以向我解釋嗎?這個for循環是什麼意思?java爲空語句循環

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

對此的任何解決方案,已經有這麼多的答案... – JackDev

回答

3

這將會形成一個無限循環,所以您需要休息一下才能擺脫它。

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) 
    }  
} 
0

由於沒有「突破」的聲明,這個循環將無限循環。無論退出條件是什麼,「break」語句都會留下一個循環。

您在那裏的代碼塊將繼續在「Try」塊中執行該操作,直到引發SomeException爲止。一旦拋出SomeException,循環將退出。檢查是否拋出SomeException不能在循環的聲明中完成,因此循環被告知永遠循環。然後循環結束的條件在循環體內指定。

0

這相當於是這樣的:

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

循環運行,直到它被明確異常處理程序打破。

請注意,如果someCondition從未設置爲true,則此(和您的for(;;))將永久運行。

如果你堅持這樣做無限循環,我將其修改爲類似:

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循環(我喜歡稱之爲「非確定性」循環)。

0

如果意味着它將不斷循環並執行'// do something'中所述的操作,直到引發'SomeException'的實例,在這種情況下,循環將終止。

它們通常用於網絡套接字編程,當應用程序在端口上偵聽時,並在出現錯誤時終止。

這是一個無限循環,或相似性的「而(真)」循環語句。

「的」循環被定義爲

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

正如你可以看到,以「爲(;;)」沒有結束的條件是指定的,它永遠循環上。在這樣的循環中'斷點'是必須的,以在滿足某些條件時防止無限循環。

我個人不喜歡使用它們,除非絕對必要。儘管沒有明顯的性能劣勢(參見why does an infinite loop of the unintended kind increase the CPU use?),但在更改無限循環內的代碼時必須非常小心,因此最終會使用「中斷」退出。