Java中return用法的再深入


return語句在順序結構中的用法

  結束該方法,繼續執行方法后的語句。

return在try-catch-finally語句中的使用

public class TestFinal {  
    public static void main(String[] args) {  
        System.out.println("test1:" + testFinal1());  
        System.out.println("test2:" + testFinal2());  
        System.out.println("test3:" + testFinal3());  
        System.out.println("test4:" + testFinal4());  
    }  
 
    static int testFinal1() {  
        int i = 1;  
        try {  
            return i;  
        } finally {  
            System.out.println("in testFinal1():finally 肯定執行");  
            i = 48;  
        }  
    }  
 
    static String testFinal2() {  
        String str = "try";  
        try {  
            return str;  
        } finally {  
            System.out.println("in testFinal2():finally 肯定執行");  
            str = "finally";  
        }  
    }  
 
    static StringBuilder testFinal3() {  
        StringBuilder build = new StringBuilder("try ");  
        try {  
            return build;  
        } finally {  
            System.out.println("in testFinal3():finally 肯定執行");  
            build.append("finally");  
            build = new StringBuilder("你猜我是誰!");  
        }  
    }  
 
    static String testFinal4() {  
        try {  
            return "return in try";  
        } finally {  
            System.out.println("in testFinal4():finally 肯定執行");  
            return "return in finally";  
        }  
    }  
}


輸出是:

在testFinal1()中,return i;會將結果i的值,也就是1壓入棧。即使在finally中將i修改了(i=48),也不回對已經壓入棧里的1造成任何影響。

in testFinal1():finally 肯定執行
test1:1
 在testFinal2()中,return str;將str的內容壓入棧,比如我們假設str的內容為0x108(只是一個地址值),通過這個地址值我們能找到"try",那棧里的內容就是0x108。執行str = "finally",這時候str這個變量的內容可能變為0x237了,這是串"finally"的地址。方法調用結束后,返回的是什么?return時壓入棧里的0x108。所以在打印結果時,我們打印的是通過0x108找到的字符串"try"。
in testFinal2():finally 肯定執行
test2:try
在testFinal3()中,return 壓棧的是build這個變量的值,比如是0x3579,通過這個值我們可以找到StringBuilder對象。finally語句塊中對這個對象的內容進行了修改。build = new StringBuilder("你猜我是誰!");讓build變量指向了一個新的對象,這時候build的值可能是0x4579了。但是,別忘了,原來的StringBuilder對象仍然在0x3579處,而我們壓棧的正是0x3579啊!方法返回后,我們得到的返回值0x3579,通過這個引用值找到相應的StringBuilder對象,所以打印的結果是test3:try finally。
in testFinal3():finally 肯定執行
test3:try finally
在testFinal4()中,finally有return語句,直接返回,方法結束。
in testFinal4():finally 肯定執行
test4:return in finally         

結論

finally的語句確實執行了,而且肯定是在方法return之前執行的,而且,如果finally中有return語句的話,方法直接結束。這里需要注意的只有一點:在try中的return語句會將返回結果值壓棧,然后轉入到finally子過程,等到finally子過程執行完畢之后(沒有return),再返回。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com