關於try...catch...finally中return的疑惑


關於try...catch...finally里面的return一直是面試的一個熱門考點。無非就分以下幾個情況:

1、當有finally語句並且try中有return,在執行到return(還未執行)的時候,會先執行finally里面的內容,然后再執行行try中的return。

package com.and.java.demo;

public class 測試 {
    public static void main(String[] args) {
        System.out.println(new 測試().test());
    }

    public String test() {
        try {
            System.out.println("try{...}");
            return "try";
        } catch (Exception e) {
            System.out.println("catch{...}");
            return "catch";
        } finally {
            System.out.println("finally{...}");
        }
    }
}

輸出:

try{...}
finally{...}
try

2、在1的基礎上,如果finally里面也有return語句,則try代碼塊中的return被屏蔽(不執行),即在try中遇到return的時候,會先執行finally里面的內容(包括finally里面的return語句)。

package com.and.java.demo;

public class 測試 {
    public static void main(String[] args) {
        System.out.println(new 測試().test());
    }

    public String test() {
        try {
            System.out.println("try{...}");
            return "try";
        } catch (Exception e) {
            System.out.println("catch{...}");
            return "catch";
        } finally {
            System.out.println("finally{...}");
            return "finally";
        }
    }
}

輸出:

try{...}
finally{...}
finally

遇到的問題:

這兩種情況想必大家已經掌握。但是還有一種情況,也是我不能理解的地方。一般情況下,在finally里面作一些數據的關閉操作(比如文件,輸入/輸出流,數據庫的關閉),試想一下,要是我們在finally里面對要返回的值進行修改,那會反應到最終的結果上去嗎?(因為從上面的講解可以知道,當try里面有return的時候,它不會立刻執行,會先執行finally里面的內容,然后再執行return)。

package com.and.java.demo;

public class 測試 {
    public static void main(String[] args) {
        System.out.println(new 測試().test());
    }

    public String test() {
        String result = "";
        try {
            result = "try";
            return result;
        } catch (Exception e) {
            result = "catch";
            return result;
        } finally {
            result = "finally";
        }
    }
}

試想一下,它會輸出"try" 呢還是"finally"呢?

輸出:

try

確實只輸出try,但是我們在finally里面是改變了result的值呀?
再進一步改進,判斷finally里面的賦值語句是否執行

package com.and.java.demo;

public class 測試 {
    public static void main(String[] args) {
        System.out.println(new 測試().test());
    }

    public String test() {
        String result = "";
        try {
            result = "try";
            return result;
        } catch (Exception e) {
            result = "catch";
            return result;
        } finally {
            System.out.println("t1->"+result);
            result = "finally";
            System.out.println("t2->"+result);
        }
    }
}

輸出:

t1->try
t2->finally
try

從輸出結果可以看出,finally里面的賦值語句是執行了的,但是在return結果中怎么就沒變呢?(目前暫時研究到這個地步,仍沒搞明白,還望各位高手指點)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM