和風(fēng)細(xì)雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運(yùn)用之術(shù)自出。

          異常機(jī)制概述

          異常機(jī)制綜述

          在運(yùn)行過程中,應(yīng)用程序可能遭遇各種嚴(yán)重程度不同的問題.異常提供了一種在不弄亂程序的情況下檢查錯(cuò)誤的巧妙方式.它也提供了一種直接報(bào)告錯(cuò)誤的機(jī)制,而不必檢查標(biāo)志或者具有此作用的域.異常把方法能夠報(bào)告的錯(cuò)誤作為方法約定的一個(gè)顯式部分.
          異常能夠被程序員看到,由編譯器檢查,并且由重載方法的子類保留.
          如果遇到意外的錯(cuò)誤將拋出異常,然后異常被方法調(diào)用棧上的子句捕獲.如果異常未被捕獲,將導(dǎo)致執(zhí)行線程的終止.

          異常的體系結(jié)構(gòu)

          毫無疑問,在java中異常是對(duì)象,它必定繼承Throwable及其子類.Throwable中含有一個(gè)用于描述異常的字符串.Exception是Throwable的一個(gè)最常用子類,另一個(gè)子類是Error.而RuntimeException繼承自Exception.


          異常的種類

          非檢查型異常(Unchecked Exception):
          非檢查型異常反映了程序中的邏輯錯(cuò)誤,不能從運(yùn)行中合理恢復(fù).
          標(biāo)準(zhǔn)的運(yùn)行時(shí)異常和錯(cuò)誤構(gòu)成非檢查型異常,它們繼承自RuntimeException和Error.
          非檢查型異常不用顯示進(jìn)行捕獲.

          檢查型異常(Checked Exception):
          這種異常描述了這種情況,雖然是異常的,但被認(rèn)為是可以合理發(fā)生的,如果這種異常真的發(fā)生了,必須調(diào)用某種方法處理.
          Java異常大多是檢查型異常,繼承自Exception類,你自己定義的異常必須是繼承Exception的檢查型異常.
          檢查型異常必須進(jìn)行顯示捕獲.

          自定義異常

          繼承Exception即可定義自己的異常,以下是一種常見寫法
          public class DBXmlFileReadException extends Exception{
            public DBXmlFileReadException(String   msg){
              super(msg);
            }
          }

          拋出異常

          在Java語句中,可以用throw語句拋出異常,如throw new NoSuchElementException();
          拋出的對(duì)象必須是Throwable類的子類型.

          拋出異常的策略:
          1) 如果拋出后不可能得到處理,可以拋出Error.
          2) 如果你想讓其它類自由選擇是否處理這個(gè)異常,就可以拋出RuntimeException.
          3) 如果你要求類的用戶必須處理這個(gè)異常,則可以拋出Exception.

          異常拋出后的控制權(quán)轉(zhuǎn)移

          一旦發(fā)生異常,異常發(fā)生點(diǎn)后的動(dòng)作將不會(huì)發(fā)生.此后將要發(fā)生的操作不是在catch塊和finally塊.

          當(dāng)異常拋出時(shí),導(dǎo)致異常發(fā)生的語句和表達(dá)式就被稱為突然完成.語句的突然完成將導(dǎo)致調(diào)用鏈逐漸展開,直到該異常被捕獲.

          如果該異常沒有捕獲,執(zhí)行線程將中止.

          Try,catch和finally

          異常由包含在try塊中的語句捕獲:
              try{
                正常執(zhí)行語句
              }
              catch(XException e){
                異常執(zhí)行語句一
              }
              catch(XXException e){
                異常執(zhí)行語句二
              }
              catch(XXXException e){
                異常執(zhí)行語句三
              }
              finally{
                中止語句
              }

          Try中的語句體要么順利完成,要么執(zhí)行到拋出異常.
          如果拋出異常,就要找出對(duì)應(yīng)于異常類或其父類的catch子句,如果未能找到合適的catch子句,異常就從try語句中擴(kuò)散出來,進(jìn)入到外層可能對(duì)它進(jìn)行處理的try語句.
          Catch子句可以有多個(gè),只要這些子句捕獲的異常類型不同.
          如果在try中有finally子句,其代碼在try把所有其它處理完成之后執(zhí)行.
          無論是正常完成或是出現(xiàn)異常,甚至是通過return或者break這樣的控制語句結(jié)束,finally子句總是被執(zhí)行.
          Catch子句和finally子句在try語句之后至少有一個(gè),不要求全部出現(xiàn).

          More…

          在catch語句中捕獲通用的異常Exception通常不是最佳策略,因?yàn)樗鼤?huì)將所有異常進(jìn)行等同處理.
          不能把基類異常的catch語句放到子類異常的catch語句之前,編譯器會(huì)在運(yùn)行之前就檢查出這樣的錯(cuò)誤.
          Try…catch對(duì)每個(gè)catch語句都從頭到尾檢查,如果找到處理同類異常的catch子句,此catch塊中的語句將得以執(zhí)行,而不再處理同層次的其它c(diǎn)atch塊.
          如果catch或finally拋出另一個(gè)異常,程序?qū)⒉粫?huì)再去檢查try的catch子句.
          Try...catch語句可以嵌套,內(nèi)層拋出的異常可被外層處理.

          Throws子句

          函數(shù)能拋出的檢查型異常用throws聲明,它后面可以是帶用逗號(hào)隔開的一系列異常類型.僅僅那些在方法中不被捕獲的異常必須列出.

          private void readObject(java.io.ObjectInputStream s)
                  throws java.io.IOException, ClassNotFoundException {
                  // Read in any hidden serialization magic
                  s.defaultReadObject();

                  // Read in size
                  int size = s.readInt();

                  // Initialize header
                  header = new Entry<E>(null, null, null);
                  header.next = header.previous = header;

                  // Read in all elements in the proper order.
                  for (int i=0; i<size; i++)
                       addBefore((E)s.readObject(), header);
                  }
          }

          More…

          Throws子句的約定是嚴(yán)格強(qiáng)制性的,只能拋出throws子句中聲明的異常類型,拋出其它類型的異常是非法的,不管是直接利用throw,還是調(diào)用別的方法間接的拋出.
          RuntimeException和Error是僅有的不必由throws子句列出的異常.
          調(diào)用函數(shù)的函數(shù)要么處理對(duì)聲明的異常進(jìn)行處理,要么也聲明同樣的異常,將收到的異常拋向上層.

          對(duì)檢查型異常通常進(jìn)行的幾種處理
          1) 用e.printStackTrace()輸出異常信息.
          2) 將異常記錄到日志中以備查,如logger.error(e.getMessage()).
          3) 試圖進(jìn)行異常恢復(fù).
          4) 告知維護(hù)者和用戶發(fā)生的情況.

          posted on 2008-02-21 20:09 和風(fēng)細(xì)雨 閱讀(252) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE

          主站蜘蛛池模板: 抚顺市| 漳州市| 胶州市| 嫩江县| 浦城县| 南城县| 咸阳市| 株洲市| 邛崃市| 正镶白旗| 土默特左旗| 桓台县| 寻甸| 威海市| 喀喇| 舟山市| 腾冲县| 禄劝| 绩溪县| 蓝山县| 玉门市| 丰宁| 富阳市| 内乡县| 天门市| 思南县| 堆龙德庆县| 宝山区| 通州市| 保康县| 阳信县| 蓬安县| 防城港市| 长顺县| 社旗县| 望江县| 怀安县| 资中县| 朝阳县| 莎车县| 进贤县|