try...catch...finally語句塊返回值

大家都知道在try…catch…finally語句塊中,finally是肯定必然執行的;catch語句塊是在出現異常時纔會執行的;

猜測一下,下面的代碼返回值是多少?是10? 11? 12? 13?

 public static int print() {
        int a = 10;
        try {
           a = 11;
           return a;
       }catch (Exception e) {
           a = 12;
       }finally {
           a = 13;
       }
   }

返回值爲11;這是大家都知道的;但是通過調試代碼可知,a的最終值爲13
調試:
在這裏插入圖片描述

  public static int print() {
        int a = 10;
        try {
            a = 11;
            return a;
       }catch (Exception e) {
            a = 12;
            return a;
       }finally {
           a = 13;
       }
   }

返回值爲11;通過調試,a的最終值爲13


    public static int print() {
        int a=10;
        try{
             a=11;
             return a;
        }catch(Exception e){
             a = 12;
        }finally {
            a=13;
            return a;
        }
    }

返回值爲13;通過調試,a的最終值爲13

public static int print2() {
        int a = 10;
        try {
            a = 11;

          }catch (Exception e) {
            a = 12;
            return  a;
        }finally {
            a = 13;
         return a;
        }

    }

返回值爲13;通過調試,a的最終值爲13

  public static int print2() {
        int a = 10;
        try {
           a = 11;
           return a;
       }catch (Exception e) {
           a = 12;
           return  a;
       }finally {
           a = 13;
           return a;
       }

   }

返回值爲13;通過調試,a的最終值爲13

有沒有發現,在finally語句塊中如果有return語句,則就會返回finally語句塊中的內容
如果finally語句塊中沒有return語句,則就會返回try語句塊中的內容,即使catch語句塊中有返回值也起不到作用,因爲catch語句塊只有在出現異常時纔會執行;

其實:
(1)異常體系中,若finally代碼塊中存在return語句,則try、catch語句失效。
(2)若finally無return,try有return語句,則try代碼塊先暫存代碼塊中的值,然後在代碼塊中還是該進行怎樣的操作就進行怎樣的操作,變量的值該怎麼變化就怎麼變化,最後執行finally代碼塊,只不過最終返回的是try語句塊中的暫存值

對於基本類型是這樣,對於對象也是這樣:

class Person{
    public int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
public class Test {
    public static Person test() {
        Person person = new Person();
        try {
            person.age = 1;
            return person;
        }catch (Exception e) {
            person.age = 2;
            return person;
        }finally {
            person = new Person();
            person.age = 3;
            return person;//finally語句塊中有return語句
        }
    }
    public static void main(String[] args) {
       
        System.out.println(test().age);
    }
}

運行結果爲:
在這裏插入圖片描述

而:

class Person{
    public int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
public class Test {
    public static Person test() {
        Person person = new Person();
        try {
            person.age = 1;
            return person;
        }catch (Exception e) {
            person.age = 2;
            return person;
        }finally {
            person = new Person();
            person.age = 3;
          //finally語句塊中無return語句
        }
    }
    public static void main(String[] args) {
       
        System.out.println(test().age);
    }
}

返回值爲:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章