1. 程式人生 > >finally和return的執行順序

finally和return的執行順序

今天看到一段程式碼,try中有return語句,後面還有一個finally,不知道執行過程是什麼樣的。於是來試驗了一下。

1.try和catch中有return時,finally裡面的語句會被執行嗎

我們可以來分別看看
(1)執行try中的return時

public class tryDemo {
    public static int show() {
        try {
            return 1;
        }finally{
            System.out.println("finally模組被執行");
        }
    }
    public
static void main(String args[]) { System.out.println(show()); } }

輸出結果如下:
這裡寫圖片描述
(2)執行catch中的return時

public class tryDemo {
    public static int show() {
        try {
            int a = 8/0;
            return 1;
        }catch (Exception e) {
            return 2;
        }finally{
            System.out
.println("finally模組被執行"); } } public static void main(String args[]) { System.out.println(show()); } }

其結果如下:
這裡寫圖片描述
我們可以得出結論:
如果程式是從try程式碼塊或者catch程式碼塊中返回時,finally中的程式碼總會執行。而且finally語句在return語句執行之後return返回之前執行的。可以使用編譯器的Debug功能檢視詳細過程。

2.如果finally也有return的時候……

public class
tryDemo { public static int show() { try { int a = 8/0; return 1; }catch (Exception e) { return 2; }finally{ System.out.println("finally模組被執行"); return 0; } } public static void main(String args[]) { System.out.println(show()); } }

執行結果如下:
這裡寫圖片描述
結論:
我們可以看到當finally有返回值時,會直接返回。不會再去返回try或者catch中的返回值。

3.finally中對於返回變數做的改變會影響最終的返回結果嗎

我們先來看一看如果try或者catch中的返回值是普通變數時。

public class tryDemo {
    public static int show() {
        int result = 0;
        try {
            return result;
        }finally{
            System.out.println("finally模組被執行");
            result = 1;
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

執行的結果如下:
這裡寫圖片描述
並不會改變返回的內容。
當返回的變數的型別是引用型別時,結果也是一樣的
程式碼如下:

public class tryDemo {
    public static Object show() {
        Object obj = new Object();
        try {
            return obj;
        }finally{
            System.out.println("finally模組被執行");
            obj = null;
        }
    }
    public static void main(String args[]) {
        System.out.println(show());
    }
}

結果如下:
這裡寫圖片描述
我們可以得出以下結論:
如果try和catch的return是一個變數時且函式的是從其中一個返回時,後面finally中語句即使有對返回的變數進行賦值的操作時,也不會影響返回的值。

相關推薦

finallyreturn執行順序

今天看到一段程式碼,try中有return語句,後面還有一個finally,不知道執行過程是什麼樣的。於是來試驗了一下。 1.try和catch中有return時,finally裡面的語句會被執行嗎 我們可以來分別看看 (1)執行try中的retur

java中異常處理finallyreturn語句的執行順序

finally程式碼塊的語句在return之前一定會得到執行 如果try塊中有return語句,finally程式碼塊沒有return語句,那麼try塊中的return語句在返回之前會先將要返回的值儲存,之後執行finally程式碼塊,最後將儲存的返回值返回,

JAVA try catch finally return 執行順序

JAVA try catch finally return 執行順序 參考:https://www.cnblogs.com/superFish2016/p/6687549.html 一、結論 1、不管有沒有出現異常,finally塊中程式碼都會執行; 2、當try和catch中有

從矩陣乘法來看-O優化ijk執行順序對程式效能的影響

從矩陣乘法來看-O優化和ijk執行順序對程式效能的影響 根據計算矩陣乘積的c程式,主要想做想做兩件事情: 統計採用不同的優化選項編譯程式所用的時間,感受-O優化帶來的效能提升。 看看矩陣乘法中不同迴圈順序對程式效能的影響: 改變三重迴圈的順序,統

try,finallyreturn之間的關係

一,finally不是一定會被執行的(1,try沒別執行,2.system.exit(0)) 二,沒有return的普通執行方式 public static void main(String[] args) { try {

java中的finallyreturn

java中的finally和return 直接看程式碼和截圖吧 由此可見,finally中如果return返回值了,那在外面就不能return返回值了 如果外面return返回值了,那finally中就不能return返回值了 程式設計這種東西,大家最好是自己親

printf()scanf()執行順序

原始碼:void main(){int a,b,c,x2,y2;printf("輸入a,b,c:\n");scanf("%d%d%d",&a,&b,&c);result(a,b,c,&x2,&y2);test(a,b,c,x2,y2);

java 中try catch finally 的具體執行順序返回結果+程式碼測試

執行順序的重點就在finally中,具體如下: (1)、try:它裡面放置可能引發異常的程式碼(2)、catch:後面對應異常型別和一個程式碼塊,用於表明該catch塊用於處理這種型別的程式碼塊,可以

spring [email protected]bean執行順序問題

從配置檔案中獲取配置使用@value,當你在bean載入時呼叫@value時會出現空指標異常。因為bean載入完成後才會執行@value。    解決辦法:spring boot 有兩種獲取配置檔案值的方式 第一種,@value(“${a.b}”)傳屬性名稱 第二種:使

JS事件機制:事件繫結、事件監聽、事件委託(代理)事件執行順序總結

JS 對於使用者的操作做出響應,就必須對DOM元素繫結事件處理函式 事件繫結  1、在DMO中直接繫結事件 <input type="button" value="click me"

servlet filter執行順序

在我們寫程式碼時,在web.xml中總能發現類似下面的程式碼: <spanstyle="font-family:KaiTi_GB2312;font-size:18px;"><spanstyle="font-family:KaiTi_GB2312;

SQL語句中的ANDOR執行順序問題

情景:一個搜尋框 可以同時根據使用者賬號或者使用者名稱字 搜尋匹配條件的使用者 如果搜尋框中沒有搜尋條件 則查出所有教師使用者 遇到的問題: 查詢條件時為輸入框內的內容 先在資料庫中模擬測試 結果

Script標籤指令碼執行順序

0.前言 估計所有讀者也慢慢適應我每次講東西之前先墨跡一段的習慣了。 那麼我今天就來個轉換,我!不!墨!跡!了! 正文開始。 1.script標籤的預設行為 首先我們先來看一下 <script> 標籤 的幾個重要特性: scri

從join onwhere執行順序認識T-SQL查詢處理執行順序

SQL語句中join連表時on和where後都可以跟條件,那麼對查詢結果集,執行順序,效率是如何呢? 通過查詢資料發現:區別:on是對中間結果進行篩選,where是對最終結果篩選。執行順序:先進行on的過濾, 而後才進行join。效率:如果是inner join, 放o

JSCSS執行順序

一、指令碼和樣式表載入、執行順序總結1、指令碼web的模式是同步的,開發者希望解析到一個script標籤時立即解析執行指令碼,並阻塞文件的解析直到指令碼執行完。如果指令碼是外引的,則網路必須先請求到這個資源——這個過程也是同步的,會阻塞文件的解析直到資源被請求到。這個模式保持了很多年,並且在html4及htm

try-catch-finally語句中用什麼方法退出或者不執行finally就直接退出並且returnfinally的執型順序是怎樣的

正常來說finally中的程式碼是一定會執行的。他和return的執行順序是在return執行之後但真正返回結果之前的中間執行,finally中新增return語句可以替換掉catch中的return語句從而可以證明這一點。但是我們可以通過制定system.exit(int

finally在trycatch塊以及return中的執行順序

執行順序 無catch時 finally會在try包含的return之後執行,會在try外面的return之前執行 當有catch時 finally是在catch執行之後catch包含的return之前執行的 執行順序圖

return情況下try,catchfinally執行順序

結論: 1、不管有木有出現異常,finally塊中程式碼都會執行; 2、當try和catch中有return時,finally仍然會執行; 3、finally是在return後面的表示式運算後執行的(此時並沒有返回運算後的值,而是先把要返回的值儲存起來,管

java中的try中的returnfinally執行順序問題

在TestTryReturn這個例子中的執行順序為:用debug進行除錯,會發現,先呼叫的是return,再呼叫finally,最後在呼叫return public class TestTryReturn { public static void main(Strin

finally,return執行順序

方法 返回值 存在 pub 無法 style 語句 tail art 參考:http://blog.csdn.net/qj19842011/article/details/45675057 關於finally,return的執行順序 例子: try{ return