1. 程式人生 > >Java中return返回結果的優先級

Java中return返回結果的優先級

spa 返回結果 turn all urn pri 保存 合並 tro

在Java開發時,異常處理是非常普遍的。先看這樣一道關於異常處理的代碼

public static int getNumer() {
    int a = 1;
    try {            
        return a;
    } catch (Exception e) {
        a = -1;
    } finally {
        a = 30;
        System.out.println(a);
    }
    return a;
}

當執行System.out.println(getNumer())返回的結果應該是多少?

A 30 30
B 30 1
C 1 30
答案是B。這個問題的本質就是在try,catch,finally中都有return語句時,執行代碼的順序是怎麽樣的,是根據哪個值來進行返回呢?

我們知道,在處理異常時,finally中的代碼是必定要執行的,這是由Java編譯器決定的,在編譯的時候,將try模塊的代碼與finally模塊的代碼合並在一起,將catch模塊的代碼與finally模塊的代碼合並在一起,這是毫無疑問的。
這樣,當finally模塊有return,那麽將會執行finally中的return,返回函數的結果,無論try, catch,還是函數體有沒有return語句。所以,該位置的return的優先級是最高的。

那麽,當finally沒有return時,是如何返回的呢?
這時,在執行完try中的模塊後,有return語句,實際不會真正的return,即只是會計算return中的表達式,之後將計算的結果保存在一個臨時棧中,接著執行finally中的語句,最後才會從臨時棧中取出之前的結果返回。
所以,函數的返回值是1而非30。

總體來說,return語句的位置有如下幾種。

public static int getNumer() {
    try {            
        return a;
    } catch (Exception e) {
        return
b; } finally { return c; } return d; }

當無異常拋出時,返回的優先級如下:c>a>d。當然,如果c存在,d是不可達代碼,編譯會錯誤的,如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Unreachable code

當有異常拋出時,返回的優先級如下:c>b>d。

總之,大家記住,finally塊中的return優先級最高,而函數體中的return的優先級最低就好了。

Java中return返回結果的優先級