程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java-JAVA finally內的處理在什麼情況下會影響到返回值?

java-JAVA finally內的處理在什麼情況下會影響到返回值?

編輯:編程綜合問答
JAVA finally內的處理在什麼情況下會影響到返回值?

例子如下,返回結果不同,前兩個方法為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{}的執行順序理解之後,加上對每個數據類型的特點有比較深的理解就可以理解這類問題了。
希望我的回答對你有幫助

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved