<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    異常問題

    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| 評論         

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    posts - 9, comments - 5, trackbacks - 0, articles - 0

    Copyright © 志成中國

    主站蜘蛛池模板: 天天影院成人免费观看| 免费在线观看一级片| 天天干在线免费视频| 亚洲另类视频在线观看| 国产又黄又爽又猛免费app| 亚洲国语在线视频手机在线| 波多野结衣中文字幕免费视频| 亚洲网站在线观看| 亚洲一区免费视频| 亚洲六月丁香六月婷婷色伊人| 啦啦啦中文在线观看电视剧免费版| 亚洲国产成人精品无码一区二区 | 手机看黄av免费网址| 亚洲码一区二区三区| 久久国产免费福利永久| 亚洲午夜电影在线观看高清 | 亚洲国产成人精品无码区在线网站| 永久免费视频网站在线观看| 亚洲春色在线观看| 免费无码AV电影在线观看| 亚洲欧美一区二区三区日产| 免费一级毛片在播放视频| 一本久久免费视频| 亚洲天堂男人天堂| 久久午夜免费视频| 羞羞视频免费观看| 国产亚洲综合色就色| 黄在线观看www免费看| 亚洲久热无码av中文字幕| 亚洲精品一级无码鲁丝片| 黄页免费在线观看| 精品亚洲456在线播放| 亚洲片国产一区一级在线观看| 国产免费无码一区二区| 亚洲国产一区在线观看| 四虎永久免费地址在线观看| 国产色爽免费无码视频| 久久亚洲精品国产精品婷婷 | 久久久亚洲欧洲日产国码二区 | 国产高清在线免费| 精选影视免费在线 |