2016-12-06 40 views
3

A.在條件部分最終關鍵字for循環

int a=10,b=20; 
    for(int i=0;a>b;i++) 
    { 
     System.out.print("aa"); 
    } 
    System.out.print("bb"); 

B.

final int a=10,b=20; 
    for(int i=0;a>b;i++) 
    { 
     System.out.print("aa"); 
    } 
    System.out.print("bb"); 

Q.爲什麼碼A打印輸出 「BB」,而代碼B返回錯誤 「不可達代碼」 ?

+2

最終變量永遠不能在運行時更改,但正常變量可以。所以在** A **有可能達到for循環的內部,但在** B **中它永遠不可能 – XtremeBaumer

+0

爲了澄清,在** A **中理論上*它可能會進入循環,如果之間有一些額外的代碼。換句話說,編譯器不會試圖猜測流,除非它真的很明顯。 – shmosel

+0

@ XtremeBaumer A和B的最終變量都沒有改變。 –

回答

2
final int a=10,b=20; 

裝置後編譯

因此這對於循環

for(int i=0;a>b;i++) 

具有從未斷裂條件(A> B永遠不會爲真),因此循環變量永遠不會改變它的值永遠,這成爲

System.out.print("bb"); 

「unreachab le code「

1

關於部分可以像下面那樣更改代碼並打印兩個輸出。請注意,在循環中執行時,可以更改a和b上的值。和輸出將是aabb

int a=10,b=20; 
    for(a=30;a>b;) 
    { 
     System.out.print("aa"); 
     a=a-20; 
    } 
    System.out.print("bb"); 

在B節上運行時它是不能改變的a或b的值,因爲這些是最終變量。由於這個原因,JVM可以識別出條件成立的可能性不可能達到a>b。 (因爲a> b總是錯誤的)。

因此,JVM會拋出編譯錯誤說無法訪問的代碼。

1

最後一個關鍵字表示a和b的值不能被改變,即它們是值而不是變量,因此for循環永遠不會執行內部語句,所以編譯器推斷for循環內的代碼是不可訪問的。

+0

代碼B,試試這個:final int a = 10,b = 20; a = 25;這會導致編譯錯誤。所以這意味着a和b是不可變的。 –

1

乙返回錯誤 「無法訪問代碼」

for(int i=0;a>b;i++) //with final modifier, `a` & `b` are constants 

編譯器是如何看待你的代碼最終的修改,這就是編譯器抱怨

for(int i=0;10>20;i++) 

10將永遠少於20,所以你的博dy在unreachable code