可達代碼我下面的代碼行java.lang.Error的:未解決的編譯錯誤:for循環
boolean b = false;
for (int i = 0; b; i++) {}
現在執行以及
如果我更換上面的代碼與
for (int i = 0; false; i++) {}
它給出 - > java.lang.Error:未解決的編譯問題:無法訪問的代碼
爲什麼呢?請幫忙。
可達代碼我下面的代碼行java.lang.Error的:未解決的編譯錯誤:for循環
boolean b = false;
for (int i = 0; b; i++) {}
現在執行以及
如果我更換上面的代碼與
for (int i = 0; false; i++) {}
它給出 - > java.lang.Error:未解決的編譯問題:無法訪問的代碼
爲什麼呢?請幫忙。
基本上b
在你的第一個代碼中不是編譯時間constant expression,而false
是。如果你在第一個代碼改變布爾變量來:
final boolean b = false;
它會太無法編譯,因爲現在它是一個常量表達式,爲b
價值不能在以後改變。
你的foreach循環的第二個參數是一個條件。雖然這個條件是true
,循環將執行。如果您給false
作爲參數,它將永遠不會執行,因此其中的代碼無法訪問。
的第一個作品和二不就是因爲編譯器沒有檢查值(或不能充分得到吧)的b
,但是當你明明白白使用false
條件一點也不含糊的原因。
如果對條件使用變量,編譯器不會抱怨,因爲它不會檢查執行到達循環時的值(這是運行時的工作),與硬編碼false
值相反。
當然!由於錯誤的情況,循環體永遠不會執行。因此,循環和i ++的主體確實無法訪問。無論如何,做這件事的意義何在?
可能是因爲'javac'在第一種情況下不推斷'b' – 2013-10-05 12:26:07
爲什麼你想要在代碼中使用這些無用的循環? –
爲了部分解釋這一點,Java編譯器(以及JVM的驗證程序,在單獨的步驟中)必須跟蹤代碼的可能執行路徑,並確定每個變量在程序中每個點上可能具有的所有值。 (由於系統完整性的原因,這比其他語言更嚴格。)如果代碼無法訪問,它可以(但不是在這種情況下)在無法進行有意義的數據流分析時產生衝突。所以這些情況在所有情況下被診斷爲錯誤。 –