Java基礎之finally語句與return語句詳解

一、return語句執行順序

finally語句是在return語句執行之後,return語句返回之前執行的

package exception;

public class Demo06 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代碼塊");
            return a += 10;
        }catch (Exception e){
            System.out.println("catch中的代碼塊");
        }finally {
            System.out.println("finally中的代碼塊");
            if(a > 10){
                System.out.println("a > 10,"+"a="+a);
            }
        }
        return a += 50;
    }
}

運行結果:

try中的代碼塊
finally中的代碼塊
a > 10,a=20
20

註意:

a > 10,a=20的結果說明瞭return a += 10已經執行瞭,但是沒有直接返回,而是先去執行finally語句的內容,然後再去返回結果

二、覆蓋問題

finally塊中的return語句會覆蓋try塊的return返回

package exception;

public class Demo07 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代碼塊");
            return a += 10;
        }catch (Exception e){
            System.out.println("catch中的代碼塊");
        }finally {
            System.out.println("finally中的代碼塊");
            if(a > 10){
                System.out.println("a>10,"+"a="+a);
            }
            return 100;
        }
    }
}

運行結果:

try中的代碼塊
finally中的代碼塊
a>10,a=20
100

註意:

(1)如果try中有return語句,finally中也有return語句,最終執行的是finally中的return語句
(2)如果finally代碼塊中寫瞭return語句,那麼finally之後的return語句就變成不可到達的語句,需要註釋掉,否則編譯不過

如果finally語句沒有return語句覆蓋返回值,那麼原來的返回值可能因為finally裡的修改而改變也有可能不變

(1)測試1

package exception;

public class Demo08 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代碼塊");
            return a += 20;
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("catch中的代碼塊");
        }finally {
            System.out.println("finally中的代碼塊");
            a  += 20;
            if(a > 10){
                System.out.println("a > 10,a="+a);
            }
            a += 20;
        }
        return 200;
    }
}

運行結果:

try中的代碼塊
finally中的代碼塊
a > 10,a=50
30

註意:

對於基本數據類型來說,finally中對返回值的修改不會影響try中的返回變量的值

(2)測試2

package exception;

import java.util.HashMap;
import java.util.Map;

public class Demo09 {
    public static void main(String[] args) {
        System.out.println(getMap().get("KEY").toString());
    }

    public static Map<String,String> getMap(){
        Map<String,String> map = new HashMap<>();
        map.put("KEY","INIT");
        try{
            map.put("KEY","try");
            return map;
        }catch (Exception e){
            e.printStackTrace();
            map.put("KEY","catch");
        }finally {
            map.put("KEY","finally");
            map = null;
        }
        return map;
    }
}

運行結果:

finally

註意:

對於引用數據類型來說,finally中對返回值的修改會影響try中的返回變量的值

三、異常情況

try塊中的return語句在異常的情況下不會被執行

package exception;

public class Demo10 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代碼塊");
            a = a/0;
            return a += 50;
        }catch (Exception e){
            a += 15;
            System.out.println("catch中的代碼塊");
        }finally {
            System.out.println("finally中的代碼塊");
            if(a > 20){
                System.out.println("a > 20,a ="+a);
            }
            a += 10;
        }
        return a;
    }
}

運行結果:

try中的代碼塊
catch中的代碼塊
finally中的代碼塊
a > 20,a =25
35

註意:

try語句塊中發生異常,try語句異常後的內容不會執行,return語句也不會執行,執行的是捕獲到的catch語句塊和finally語句塊

try中發生異常時,return寫在catch語句中

package exception;

public class Demo11 {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func(){
        int a = 10;
        try{
            System.out.println("try中的代碼塊");
            a = a /0;
            return a += 10;
        }catch (Exception e){
            System.out.println("catch中的代碼塊");
            return a += 15;
        }finally {
            System.out.println("finally中的代碼塊");
            if (a > 10){
                System.out.println("a > 10, a = "+a);
            }
            a += 50;
            System.out.println(a);
        }
    }
}

運行結果:

try中的代碼塊
catch中的代碼塊
finally中的代碼塊
a > 10, a = 25
75
25

註意:

try中發生異常之後,catch中的return語句先執行,確定瞭返回值之後(保存起來,finally中的語句對返回值無影響)再去finally語句塊,執行完之後再返回a的值,finally中對a的修改對返回值無效

四、finally語句一定會被執行嗎?

(1)當程序進入try語句之前就出現異常時,會直接結束

(2)try語句塊中有強制退出時也不會執行finally語句塊中的代碼

System.exit(0);

代碼示例:

package exception;

public class Demo12 {
    public static void main(String[] args) {
        int a = 10;
        try{
            System.out.println("try block");
            System.exit(0);
        }catch (Exception e){
            System.out.println("catch block");
        }finally {
            System.out.println("finally block");
        }
    }
}

運行結果:

try block

到此這篇關於Java基礎之finally語句與return語句詳解的文章就介紹到這瞭,更多相關java finally語句與return語句內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: