最近我在一些java代碼中看到了以下模式。有人可以向我解釋嗎?這個for循環是什麼意思?java爲空語句循環
for (;;) {
try {
// do something
} catch (Exception e) {
if (e instanceof SomeException) {
break;
}
}
}
最近我在一些java代碼中看到了以下模式。有人可以向我解釋嗎?這個for循環是什麼意思?java爲空語句循環
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」語句都會留下一個循環。
您在那裏的代碼塊將繼續在「Try」塊中執行該操作,直到引發SomeException爲止。一旦拋出SomeException,循環將退出。檢查是否拋出SomeException不能在循環的聲明中完成,因此循環被告知永遠循環。然後循環結束的條件在循環體內指定。
這相當於是這樣的:
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
循環意味着根據變量的特定增量(或減量)來做事情...我喜歡稱它爲「確定性」循環(我不太確定它是否是合適的名稱) 。如果你需要做的不是給你一個方法來使用變量的特定增量(或遞減)作爲中斷條件,我認爲你應該考慮使用while
或do... while
循環(我喜歡稱之爲「非確定性」循環)。
如果意味着它將不斷循環並執行'// 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?),但在更改無限循環內的代碼時必須非常小心,因此最終會使用「中斷」退出。
對此的任何解決方案,已經有這麼多的答案... – JackDev