2013-10-05 63 views
0

可達代碼我下面的代碼行java.lang.Error的:未解決的編譯錯誤:for循環

boolean b = false; 
for (int i = 0; b; i++) {} 

現在執行以及

如果我更換上面的代碼與

for (int i = 0; false; i++) {} 

它給出 - > java.lang.Error:未解決的編譯問題:無法訪問的代碼

爲什麼呢?請幫忙。

+1

可能是因爲'javac'在第一種情況下不推斷'b' – 2013-10-05 12:26:07

+2

爲什麼你想要在代碼中使用這些無用的循環? –

+0

爲了部分解釋這一點,Java編譯器(以及JVM的驗證程序,在單獨的步驟中)必須跟蹤代碼的可能執行路徑,並確定每個變量在程序中每個點上可能具有的所有值。 (由於系統完整性的原因,這比其他語言更嚴格。)如果代碼無法訪問,它可以(但不是在這種情況下)在無法進行有意義的數據流分析時產生衝突。所以這些情況在所有情況下被診斷爲錯誤。 –

回答

8

基本上b在你的第一個代碼中不是編譯時間constant expression,而false是。如果你在第一個代碼改變布爾變量來:

final boolean b = false; 

它會太無法編譯,因爲現在它是一個常量表達式,爲b價值不能在以後改變。

4

你的foreach循環的第二個參數是一個條件。雖然這個條件是true,循環將執行。如果您給false作爲參數,它將永遠不會執行,因此其中的代碼無法訪問。

的第一個作品和二不就是因爲編譯器沒有檢查值(或不能充分得到吧)的b,但是當你明明白白使用false條件一點也不含糊的原因。

2

如果對條件使用變量,編譯器不會抱怨,因爲它不會檢查執行到達循環時的值(這是運行時的工作),與硬編碼false值相反。

0

當然!由於錯誤的情況,循環體永遠不會執行。因此,循環和i ++的主體確實無法訪問。無論如何,做這件事的意義何在?

相關問題