try catch finally

問題描述

筆試

這是京東校招的筆試題:java

clipboard.png

運行

clipboard.png

打印運行結果,就是3測試

clipboard.png

clipboard.png

clipboard.png

分析

咱們將returnfinally拆爲幾種狀況綜合分析。spa

finally以後return

private static int func() {
    int a = 1;
    try {
        System.out.println("try");
        return a;
    } catch (Exception e) {
        System.out.println("catch");
    } finally {
        System.out.println("finally");
    }
    System.out.println("afterFinally");
    return 10;
}

clipboard.png

看執行結果,咱們分析return的原理。3d

try中執行到return時,先把這個值存起來,再開闢一塊內存存這個值,而後去執行finallyfinally執行以後,回去執行以前沒執行完的return語句,將值返回。因此這種狀況下,finally後的代碼塊是不執行的。code

finally中return

private static int func() {
    int a;
    try {
        System.out.println("try");
        a = 1;
        return a;
    } catch (Exception e) {
        System.out.println("catch");
        a = 2;
        return a;
    } finally {
        System.out.println("finally");
        a = 3;
        return a;
    }
}

這就和筆試題中同樣了。對象

clipboard.png

tryreturn,而後去執行finally,發現finally中也有return,而後就執行的是finally中的return,返回值爲3blog

finally中改變變量的值

基本數據類型

將上一個例子中finally中的return a;刪了,就是咱們接下來的測試。咱們看看finally中對變量的改變對返回值有沒有影響。ip

private static int func() {
    int a;
    try {
        System.out.println("try");
        a = 1;
        return a;
    } catch (Exception e) {
        System.out.println("catch");
        a = 2;
        return a;
    } finally {
        System.out.println("finally");
        a = 3;
    }
}

clipboard.png

trya = 1;內存

clipboard.png

clipboard.png

tryreturn a;it

clipboard.png

clipboard.png

finallya = 3;

clipboard.png

clipboard.png

這裏雖然執行了a = 3,可是改變的是a的值,並無改變返回值。

要是不信咱們在finally再添加一行輸出以驗證咱們的猜測。

clipboard.png

clipboard.png

引用數據類型

相信這裏我分爲兩個類別來敘述,熟悉Java的你應該明白我接下來要說什麼了。

clipboard.png

建個類MyObject,這裏是爲了演示方便纔將value設置爲public的,不要效仿啊。

public static void main(String[] args) {
    MyObject object = func();
    System.out.println(object.value);
}

private static MyObject func() {
    MyObject myObject = new MyObject();
    try {
        System.out.println("try");
        myObject.value = 1;
        return myObject;
    } catch (Exception e) {
        System.out.println("catch");
        myObject.value = 2;
        return myObject;
    } finally {
        System.out.println("finally");
        myObject.value = 3;
    }
}

與以前相似,不過這裏是在finally中修改對象的屬性。

clipboard.png

運行,返回的結果是咱們在finally中改變過的值。

clipboard.png

finally中改變的,是myObject這個對象的value值,這個對象在堆內存中,而棧內存中用於返回的對象,其實也是堆內存中對象的引用,因此finally的改變會改變引用數據類型的返回值。

總結

格物致知,這是對基礎的最佳實踐。
相關文章
相關標籤/搜索