1. 程式人生 > 其它 >try-catch-finally執行順序的探索(建議採用除錯)

try-catch-finally執行順序的探索(建議採用除錯)

try-catch-finally執行順序的探索(建議採用除錯)

1.try{ }塊中捕捉到異常執行順序

try中的return不會執行---》跳到catch塊中執行,執行其中的return語句,但是不會跳出去--》繼續執行finally中語句並在其中的return語句返回

package com.xurong.test;

/**
 * @auther xu
 * @date 2022/3/22 - 20:48
 */
public class test {
    public static void main(String[] args) {
        
        int a = WithException();
        System.out.println(a);
    }
    public static int WithException(){

        int i=10;

        try{

            System.out.println("i in try block is : "+i);

            i = i/0;//產生異常

            return --i;

        }

        catch(Exception e){

            System.out.println("i in catch - form try block is : "+i);

            --i;

            System.out.println("i in catch block is : "+i);

            return --i;

        }

        finally{

            System.out.println("i in finally - from try or catch block is--"+i);

            --i;

            System.out.println("i in finally block is--"+i);

            return --i;

        }

    }

}




i in try block is : 10
i in catch - form try block is : 10
i in catch block is : 9
i in finally - from try or catch block is--8
i in finally block is--7
6

2.try{ }塊中沒有捕捉到異常執行順序

執行try{ }塊中的return,將執行的return值儲存在棧中---》沒有異常產生,不會執行catch()中的語句--》執行finally內容

package com.xurong.test;

/**
 * @auther xu
 * @date 2022/3/22 - 20:48
 */
public class test {
    public static void main(String[] args) {

        int a = WithException();
        System.out.println(a);
    }
    public static int WithException(){

        int i=10;

        try{

            System.out.println("i in try block is : "+i);

            i = i/1;//沒有產生異常

            return --i;

        }

        catch(Exception e){

            System.out.println("i in catch - form try block is : "+i);

            --i;

            System.out.println("i in catch block is : "+i);

            return --i;

        }

        finally{

            System.out.println("i in finally - from try or catch block is--"+i);

            --i;

            System.out.println("i in finally block is--"+i);

            return --i;

        }

    }

}




i in try block is : 10
i in finally - from try or catch block is--9
i in finally block is--8
7

結論一:

return語句並不是函式的最終出口,如果有finally語句,這在return之後還會執行finally(return的值會暫存在棧裡面,等待finally執行後再返回)

結論二:

finally裡面不建議放return語句,根據需要,return語句可以放在try和catch裡面和函式的最後。

補充:

規則:
1.try塊是必須的,catch塊和finally塊都是可選的,但必須存在一個或都存在。try塊不能單獨存在。
2.try塊裡的語句執行中出現異常會跳過try塊裡其他語句,直接執行catch裡的語句。
3.無論try塊中是否有異常,無論catch塊中的語句是否實現,都會執行finally塊裡的語句。
4.只有一種辦法不執行finally塊裡的語句,那就是呼叫System.exit(1);方法,即退出java虛擬機器。

參考:

[https://www.nowcoder.com/profile/168268554/test/54165848/44594#summary]: