java try catch 誰(shuí)先執(zhí)行問(wèn)題,你能說(shuō)明白嗎
問(wèn)題1
try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?
也許你的答案是在return之前,但往更細(xì)地說(shuō),我的答案是在return中間執(zhí)行,請(qǐng)看下面程序代碼的運(yùn)行結(jié)果:
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;
}
}
}
---------執(zhí)行結(jié)果是什么 為什么 ---------
問(wèn)題2
下面的程序代碼輸出的結(jié)果是多少?
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 回答的很好了,只有幾點(diǎn)補(bǔ)充下,首先代碼例子用的是基本數(shù)據(jù)類型,他們進(jìn)行傳值就是傳值,其次finally的用途是用來(lái)回收系統(tǒng)資源的,沒(méi)有catch也是正常的使用(不catch,把異常throw回調(diào)用方法),再有finally和return是有關(guān)系的,而且經(jīng)常有人提,就是finally的代碼在return前運(yùn)行,這就是我為什么先說(shuō)你的例子是基本數(shù)據(jù)類型的原因,因?yàn)閞eturn x(1);被放入stack中,stack是后進(jìn)先出的,等待finally運(yùn)行完再運(yùn)行,但他已經(jīng)被賦值了就是1,如果你把代碼改成這樣試試看
public Something getSome(){
Something s = new Something("Dog");
try{
return s;
}finally{
s.name ="cat";
}}
加個(gè)類
class Something{
public String name ;
something(String name){
this.name = name;}
}
因?yàn)橄鄬?duì)于基本數(shù)據(jù)類型,引用傳值傳的值是個(gè)地址,return s(地址);放入stack中,又被取出時(shí)地址不變但地址那邊的數(shù)據(jù)已經(jīng)是cat了贊同0| 評(píng)論
第1個(gè)
有finally的話
try 里的return 是先保存x的結(jié)果 等待finally走完 雖然x變2了 但是return的值還是1
因?yàn)榈絩eturn的時(shí)候已經(jīng)把x的值取出來(lái) 等待finally走完 不管x怎么變 之前的1是不會(huì)變的
第2個(gè)
return 等待finally走完 但是finally里return了 所以返回的是2
贊同0| 評(píng)論 2012-6-19 14:54 暢捷通丶稀飯 | 五級(jí)
第一個(gè)是1,因?yàn)?x=1 try里面返回的是1 后面又執(zhí)行了finally 后。X 是2 但是沒(méi)有返回。所以 還是1
第二個(gè)是2,因?yàn)閒inally最后執(zhí)行,返回的是2. 贊同0| 評(píng)論 2012-6-19 14:56 java2000_net |
finally中的語(yǔ)句是一定要執(zhí)行的,這點(diǎn)是肯定的。finally中的語(yǔ)句執(zhí)行在try之后。通常try是要和catch(不捕獲異常try就沒(méi)意義了)。一般的用法是:
try{
1想要執(zhí)行的代碼
}catch(Exception e){
2異常處理
}finally{
3最終執(zhí)行的代碼
}
1中代碼沒(méi)錯(cuò)執(zhí)行的順序就是1->3
1中代碼有錯(cuò)執(zhí)行的順序是2->3
finally中的代碼和return是沒(méi)關(guān)系的,你可以把return寫在任何地方。它只和try、catch有關(guān)。假如你把問(wèn)題一種finally的代碼寫成:
finally{
return ++x;
}那么結(jié)果就是2了。
finally一定會(huì)執(zhí)行,且在try或catch之后執(zhí)行。
不知道這么說(shuō)能明白嗎~~~
不明白可以問(wèn),我再回答~~~ 贊同0| 評(píng)論 2012-6-19 15:22 黑夜也明亮 | 四級(jí)
問(wèn)題1:答案 1。因?yàn)閞eturn的值在執(zhí)行finally之前已經(jīng)確定下來(lái)了。所以即使在finally里怎么該值它始終是1,除非在finally里在return ++x重新修改返回的值。return x它不會(huì)直接返回值回去而是等程序執(zhí)行完finaly后才返回。
你因該有聽(tīng)過(guò)有finaly的程序一定會(huì)執(zhí)行finaly代碼吧。
問(wèn)題2:答案 2。根據(jù)一的結(jié)論二也是成立的。 贊同0| 評(píng)論 2012-6-19 16:41 iedgtg | 五級(jí)
第一個(gè)問(wèn)題:輸出的是1,因?yàn)閒inally總是在try-catch執(zhí)行之后執(zhí)行,而且,一定是在return之前執(zhí)行。第一個(gè)問(wèn)題里應(yīng)該是在return x;之前執(zhí)行,但是,此時(shí)return的值已經(jīng)固定了,就是說(shuō)finally再執(zhí)行也改變不了return的值,當(dāng)然x的值成了2,但是return的值已經(jīng)固定為1了。
第二個(gè)問(wèn)題:輸出的是2,因?yàn)閒inally一定是在return之前執(zhí)行,本來(lái)程序return的值是1,即將要return了,但是有finally,所以finally先執(zhí)行,所以return的值是2。
但是第二種情況不建議使用,就是說(shuō)finally里不建議用return,因?yàn)檫@樣finally就沒(méi)有正常的執(zhí)行完畢,這是不推薦的。 贊同0| 評(píng)論