例子如下,返回結果不同,前兩個方法為finally沒處理前的結果,而後一個方法的返回值為處理後的結果。請問這是為什麼。
public class Test {
public static void main(String[] args) {
System.out.println(test1());
System.out.println(test2());
System.out.println(test3());
}
private static int test1()
{
int n=1;
try
{
return n;
}
finally
{
n=n+1;
}
}
private static String test2()
{
String x = new String();
x="xxx";
try
{
return x;
}
finally
{
x=x+"a";
}
}
private static StringBuffer test3()
{
StringBuffer b = new StringBuffer();
b.append("xxx");
try
{
return b;
}
finally
{
b.append("a");
}
}
}
首相finally{}的執行時間是在try{}中間的return返回的中間或者是之後。准確的說是在return語句的中間,但是可以理解為return之後。所以第一種情況的結果必然是1,因為此時的n是1。
第二種情況是String,這裡要理解String的特性,String是不可變的,是內容不可以變的,但是應用是可變的。在finally執行之前已經return了String的一個引用了,此String的引用指向的是xxx。所以即使後面的String所指向的內容已經變化但是對之前那個不造成影響。
第三種情況是,StringBuffer,String與Stringbuffer之間的不同是,String是內容不可以變,而Stringbuffer是內容可變。所以返回的StringBuffer的引用之後,在finally裡面對b所指向的引用內容進行了改變,雖然引用b的地址值沒有改變,但是到main方法裡面時,b所指向的內容已經變化了,所以打印出來的結果也是變化後的結果。
對於這個try{}finally{}的執行順序理解之後,加上對每個數據類型的特點有比較深的理解就可以理解這類問題了。
希望我的回答對你有幫助