2013-07-10 30 views
-5

我有以下問題: 我知道下面的代碼的輸出的Java終於迴歸

try { 
    int a = 0; 
    System.out.println("The method will return " + a); 
    return a; 
} catch (Exception e) { 
    ; 
} 
finally { 
    System.out.println("Finally executed"); 
} 

The method will return 0 
Finally executed 

我的問題是:什麼是下面的代碼返回?

int a = 0; 
try { 
    System.out.println("The method will return " + a); 
    return a; 
} catch (Exception e) { 
    ; 
} 
finally { 
    System.out.println("Finally executed"); 
    a = 1; 
    return a; 
} 

換句話說,最終是在調用方法的代碼之前還是之後執行的?

+18

*「我的問題是:下面的代碼返回什麼?」*當你嘗試時發生了什麼? –

+0

'finally'在'try-catch'序列中的所有內容之後執行,以執行一些基本的清理工作。所以,如果你遇到一個異常,'a'的值將會是1,否則,它只會返回0. –

回答

3

finally塊在return語句後執行。該方法將返回0,因爲那時已讀取了a的值,並且更改它不會再更改返回值。

要更改返回值,您可以在finally塊中添加return語句。這不是真的值得推薦,因爲現在兩個返回語句被執行,這對大多數人來說是不直觀的。

... 
finally { 
    System.out.println("Finally executed"); 
    return 1; 
} 
+0

我錯過了返回...無論如何,這是一個「好奇心」,我永遠不會寫這樣的代碼... –

2

該方法的輸出將如前所述。返回後作出的a分配將沒有可見的效果,即呼叫者將收到0作爲返回值。由於try塊不會丟失,所以最後的return實際上是無法訪問的。

finally塊在計算完返回值後,但在接收器取回值之前執行。

如果你返回一個可變的對象,而不是原始的,雖然答案會改變:基因突變,如果有的話,您在finally塊做,就可以看到你的函數的調用:

static int[] test() { 
    int[] a = new int[1]; 
    try { 
     System.out.println("The method will return [" + a[0] + "]"); 
     return a; 
    } catch (Exception e) { 
     ; 
    } finally { 
     System.out.println("Finally executed"); 
     a[0] = 1; 
    } 
    return a; 
} 

以上,將返回int[] {0},但呼叫者將得到int[] {1}

注意:如果您認爲這是邪惡的,您可能是對的。

0

如果沒有異常,它將返回0或將返回finally語句(1)後面的內容。請小心,因爲如果catch引發異常(情況並非如此),它將不會返回任何值,但finally語句將運行。

0

finally塊在將控制權返回給調用者之前執行。

0

輸出將是

The method will return 0 
Finally executed 

來電者將獲得價值爲0

,如果你把調試程序return語句。你可以很容易地發現爲什麼改變a的值對返回值沒有任何影響