Java中return返回結果的優先級
阿新 • • 發佈:2019-01-27
spa 返回結果 turn all urn pri 保存 合並 tro A 30 30
B 30 1
C 1 30
答案是B。這個問題的本質就是在try,catch,finally中都有return語句時,執行代碼的順序是怎麽樣的,是根據哪個值來進行返回呢?
在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())返回的結果應該是多少?
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) { returnb; } 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返回結果的優先級