java異常處理執行順序詳解try catch finally

不含return的執行順序

執行順序為執行try中代碼,如果沒有異常,然後執行try catch後續的代碼。如:

public static void main(String[] args) {
        try {
            int j = 10 / 2;
            System.out.println("執行try中代碼!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("執行catch中代碼!");
        }
        System.out.println("執行catch後的代碼!");
    }

執行結果為:

在這裡插入圖片描述

如果有異常,則try中異常後的代碼將不執行,開始執行catch中的代碼,執行完成後,執行try catch後續的代碼,示例代碼如下:

    public static void main(String[] args) {
        try {
            int j = 10 / 0;
            System.out.println("執行try中代碼!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("執行catch中代碼!");
        }
        System.out.println("執行catch後的代碼!");
    }

執行結果

在這裡插入圖片描述

發生異常語句後的代碼:System.out.println(“執行try中代碼!”)不再執行。

finally子句

使用try catch finally子句時,無論發生不發生異常,finally子句中的代碼都是要執行,一般用於釋放資源、連接等操作。

   public static void main(String[] args)  {
        try {
            int i = 8/0;
            System.out.println("執行try中代碼!");
        } catch (Exception e) {
            System.out.println("執行catch中代碼!");
        } finally {
            System.out.println("執行finally中代碼!");
        }
        System.out.println("執行try catch後的代碼!");
    }

執行try catch或try catch finally之後,執行後續的代碼。

含return的執行順序

如果不包含finally語句,在try子句和catch子句中均含有return語句,代碼遇到return語句則終止代碼的執行,try catch後面的語句不可能得到執行。

在這裡插入圖片描述

含有finally語句的try catch子句包含return語句執行順序,執行finally子句,然後執行try或者catch的return語句,此時若finally語句包含return或終止運行,則try catch子句中的return語句將不執行。如:

    public static void main(String[] args)  {
       Integer i= testReturn();
        System.out.println(i);
    }

    public static Integer testReturn(){
        try {
            int i = 8/0;
            System.out.println("執行try中代碼!");
            return 1;
        } catch (Exception e) {
            System.out.println("執行catch中代碼!");
            return 0;
        }
        finally {
            System.out.println("執行finally中代碼!");
            return 3;
        }
    }

執行結果

在這裡插入圖片描述

如果再finally終止程序運行,則丟失返回值

public static void main(String[] args)  {
       Integer i= testReturn();
        System.out.println(i);
    }
    public static Integer testReturn(){
        try {
            int i = 8/0;
            System.out.println("執行try中代碼!");
            return 1;
        } catch (Exception e) {
            System.out.println("執行catch中代碼!");
            return 0;
        }
        finally {
            System.out.println("執行finally中代碼!");
            System.exit(0);  //退出程序,返回值丟失
        }
    }

執行結果如下圖:

在這裡插入圖片描述

沒有輸出返回值

返回類型是對象類型時值的變化

返回類型如果是對象類型,則返回的是指針。此時如果finally中包含對象的炒作,註意返回值的變化。示例代碼如下
創建一個Person的類

public class Person {
    private  String name;
    private  String adress;
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", adress='" + adress + '\'' +
                '}';
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAdress() {
        return adress;
    }

    public void setAdress(String adress) {
        this.adress = adress;
    }
}

含有return的測試代碼如下

    public static void main(String[] args)  {
        Person person = testObjReturn();
        System.out.println(person.toString());
    }
    public static Person testObjReturn(){
        Person person = new Person();
        try {
            int i = 8/0;
            person.setName("王小二");
            person.setAdress("電子街1號");
            return person;
        } catch (Exception e) {
            person.setName("朱小三");
            person.setAdress("電子街1號");
            return person;
        }
        finally {
            person.setName("李老五");;
        }
    }

執行結果

在這裡插入圖片描述

結論

try catch finally帶有return語句時,既可以將return語句放到try和catch中,也可以放到過程的結尾,一般建議放到結尾,便於統一管理。特別註意finally包含return語句時try、catch中的return將不再執行。尤其當返回的變量是實體對象時,finally中的語句如果對返回的變量進行修改,則將影響到返回值。

以上就是java異常處理執行順序詳解try catch finally的詳細內容,更多關於java異常try catch finally執行順序的資料請關註WalkonNet其它相關文章!

推薦閱讀: