1. 程式人生 > >try中return某值,而finally中修改了這個值

try中return某值,而finally中修改了這個值

try中return某值,而finally中修改了這個值
首先上結論:

1、try{…} finally{…} return 
順序執行
2、try{ return } finally{…} return 
finally修改基本型別,則不影響返回值
finally修改非基本型別,影響返回值

3、try{ return } finally{ return } 
try的return表示式執行,但不返回。在finally中返回


本文按以下三方面進行實驗

try中無return、finally中無return
try中有return、finally中無return
try中有return、finally中有return
最後總結
1、try中無return,finally中無return
此時程式就是順序執行,當執行func(10)時,首先執行try{…},然後執行finally{…},最終的返回值是12

public static int func(int x) {
    try {
        x++;
    }catch(Exception e) {

    }finally {
        x++;
    }
    return x;


2、try中有return,finally中無return
如果發生改變的是基本型別(byte、short、int、long等),finally雖然執行,但是不影響 最終返回值
如果發生改變的是非基本型別(物件),則finally影響返回的值

//Example1:基本型別

public static int func(int x) {
    try {
        x++;    // 執行順序 1
        return x++; // 執行順序 2
    }catch(Exception e) {

    }finally {
        System.out.println("x = " + x); 
        System.out.println("finally"); //執行順序 3
        x += 2;
    }

    // 下面的程式碼不執行,因為在try中就return了
    System.out.println("return"); 
    return x;
}

上面程式碼執行的順序是:

x++ 
return x++ ,不返回而是執行x++,並將結果快取起來。等到finally執行完後再返回。 
System.out.println(“finally”);

Example2:非基本型別

class A {
    int val = 0;
}

public static A func(A a) {
    try {
        a.val = 1; // 執行順序 1
        return a;  // 執行順序 2
    }catch(Exception e) {

    }finally {
        a.val = 2; // 執行順序 3
    }

    // 下面的程式碼不執行
    System.out.println("return");
    return a;
}

// Test case
A a = new A();
System.out.println(func(a).val); // 2

上面程式碼執行的順序是:

a.val = 1 
return a; // 先不返回 
a.val = 2;3、try中有return,finally中有return

Example1:基本型別

public static int func(int x) {
    try {
        return x++; // 執行順序 1
    }catch(Exception e) {

    }finally {
        System.out.println("finally"); // 執行順序 2
        x += 2; // 執行順序 3
        return x; // 執行順序 4
    }
}

執行func(10)的結果是:13 
首先執行try中 return的x++,但是結果不返回,而是快取起來。 
然後執行finally中的語句,最後在finally中返回。

Example2:非基本型別

class A {
    int val = 0;
}

public static A func(A a) {
    try {
        a.val++;  // 執行順序 1
        return a;
    }catch(Exception e) {

    }finally {
        System.out.println("finally"); // 執行順序 2
        a.val++; // 執行順序 3
        return a; // 執行順序 4
    }
}

與基本型別相似,首先執行try中 a.val++,但是結果不返回,而是快取起來。 
然後執行finally中的語句,最後在finally中返回。

總結一下:

try{…} finally{…} return

順序執行
try{ return } finally{…} return

finally修改基本型別,則不影響返回值
finally修改非基本型別,影響返回值
try{ return } finally{ return }

try的return表示式執行,但不返回。在finally中返回