Posted on 2012-11-09 16:00
志成中國 閱讀(197)
評論(0) 編輯 收藏
java try catch 誰先執行問題,你能說明白嗎
問題1
try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?
也許你的答案是在return之前,但往更細地說,我的答案是在return中間執行,請看下面程序代碼的運行結果:
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
---------執行結果是什么 為什么 ---------
問題2
下面的程序代碼輸出的結果是多少?
public class smallT
{
public static void main(String args[])
{
smallT t = new smallT();
int b = t.get();
System.out.println(b);
}
public int get()
{
try
{
return 1 ;
}
finally
{
return 2 ;
}
}
}
2012-6-19 16:23 滿意回答 輸出是1和2,
20705080 回答的很好了,只有幾點補充下,首先代碼例子用的是基本數據類型,他們進行傳值就是傳值,其次finally的用途是用來回收系統資源的,沒有catch也是正常的使用(不catch,把異常throw回調用方法),再有finally和return是有關系的,而且經常有人提,就是finally的代碼在return前運行,這就是我為什么先說你的例子是基本數據類型的原因,因為return x(1);被放入stack中,stack是后進先出的,等待finally運行完再運行,但他已經被賦值了就是1,如果你把代碼改成這樣試試看
public Something getSome(){
Something s = new Something("Dog");
try{
return s;
}finally{
s.name ="cat";
}}
加個類
class Something{
public String name ;
something(String name){
this.name = name;}
}
因為相對于基本數據類型,引用傳值傳的值是個地址,return s(地址);放入stack中,又被取出時地址不變但地址那邊的數據已經是cat了贊同0| 評論
第1個
有finally的話
try 里的return 是先保存x的結果 等待finally走完 雖然x變2了 但是return的值還是1
因為到return的時候已經把x的值取出來 等待finally走完 不管x怎么變 之前的1是不會變的
第2個
return 等待finally走完 但是finally里return了 所以返回的是2
贊同0| 評論 2012-6-19 14:54 暢捷通丶稀飯 | 五級
第一個是1,因為 x=1 try里面返回的是1 后面又執行了finally 后。X 是2 但是沒有返回。所以 還是1
第二個是2,因為finally最后執行,返回的是2. 贊同0| 評論 2012-6-19 14:56 java2000_net |
finally中的語句是一定要執行的,這點是肯定的。finally中的語句執行在try之后。通常try是要和catch(不捕獲異常try就沒意義了)。一般的用法是:
try{
1想要執行的代碼
}catch(Exception e){
2異常處理
}finally{
3最終執行的代碼
}
1中代碼沒錯執行的順序就是1->3
1中代碼有錯執行的順序是2->3
finally中的代碼和return是沒關系的,你可以把return寫在任何地方。它只和try、catch有關。假如你把問題一種finally的代碼寫成:
finally{
return ++x;
}那么結果就是2了。
finally一定會執行,且在try或catch之后執行。
不知道這么說能明白嗎~~~
不明白可以問,我再回答~~~ 贊同0| 評論 2012-6-19 15:22 黑夜也明亮 | 四級
問題1:答案 1。因為return的值在執行finally之前已經確定下來了。所以即使在finally里怎么該值它始終是1,除非在finally里在return ++x重新修改返回的值。return x它不會直接返回值回去而是等程序執行完finaly后才返回。
你因該有聽過有finaly的程序一定會執行finaly代碼吧。
問題2:答案 2。根據一的結論二也是成立的。 贊同0| 評論 2012-6-19 16:41 iedgtg | 五級
第一個問題:輸出的是1,因為finally總是在try-catch執行之后執行,而且,一定是在return之前執行。第一個問題里應該是在return x;之前執行,但是,此時return的值已經固定了,就是說finally再執行也改變不了return的值,當然x的值成了2,但是return的值已經固定為1了。
第二個問題:輸出的是2,因為finally一定是在return之前執行,本來程序return的值是1,即將要return了,但是有finally,所以finally先執行,所以return的值是2。
但是第二種情況不建議使用,就是說finally里不建議用return,因為這樣finally就沒有正常的執行完畢,這是不推薦的。 贊同0| 評論