異常問題

          Posted on 2012-11-09 16:00 志成中國 閱讀(201) 評論(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 © 志成中國

          主站蜘蛛池模板: 雅江县| 新乐市| 云浮市| 花莲县| 贡嘎县| 通城县| 康乐县| 尼勒克县| 大名县| 抚松县| 讷河市| 太和县| 常州市| 沈阳市| 高要市| 毕节市| 怀远县| 饶平县| 姚安县| 内黄县| 章丘市| 涿州市| 汉源县| 沂水县| 苏尼特左旗| 余干县| 原平市| 黑水县| 太仓市| 安化县| 酒泉市| 浦城县| 乐业县| 永宁县| 阿城市| 绥滨县| 嘉定区| 南阳市| 黄骅市| 河津市| 沙田区|