隨筆-19  評(píng)論-5  文章-3  trackbacks-0
          一、異常的概念和Java異常體系結(jié)構(gòu)
          Java把異常當(dāng)作對(duì)象來處理,并定義一個(gè)基類java.lang.Throwable作為所有異常的超類。在Java API中已經(jīng)定義了許多異常類,這些異常類分為兩大類,錯(cuò)誤Error和異常Exception。
          Thorwable類所有異常和錯(cuò)誤的超類,有兩個(gè)子類Error和Exception,分別表示錯(cuò)誤和異常。其中異常類Exception又分為運(yùn)行時(shí)異常(RuntimeException)和非運(yùn)行時(shí)異常,也稱之為不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)。
          Error是程序無法處理的錯(cuò)誤,比如OutOfMemoryError、ThreadDeath等。這些異常發(fā)生時(shí),Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止。
          Exception是程序本身可以處理的異常,這種異常分兩大類運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。程序中應(yīng)當(dāng)盡可能去處理這些異常。
          運(yùn)行時(shí)異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。
          非運(yùn)行時(shí)異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語(yǔ)法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

          二、異常的捕獲和處理
          Java異常的捕獲和處理是一個(gè)不容易把握的事情,如果處理不當(dāng),不但會(huì)讓程序代碼的可讀性大大降低,而且導(dǎo)致系統(tǒng)性能低下,甚至引發(fā)一些難以發(fā)現(xiàn)的錯(cuò)誤。
          Java異常處理涉及到五個(gè)關(guān)鍵字,分別是:try、catch、finally、throw、throws。

          try、catch、finally三個(gè)語(yǔ)句塊應(yīng)注意的問題
          1>try、catch、finally三個(gè)語(yǔ)句塊均不能單獨(dú)使用,三者可以組成 try...catch...finally、try...catch、try...finally三種結(jié)構(gòu),catch語(yǔ)句可以有一個(gè)或多個(gè),finally語(yǔ)句最多一個(gè)。
          2>try、catch、finally三個(gè)代碼塊中變量的作用域?yàn)榇a塊內(nèi)部,分別獨(dú)立而不能相互訪問。如果要在三個(gè)塊中都可以訪問,則需要將變量定義到這些塊的外面。
          3>多個(gè)catch塊時(shí)候,只會(huì)匹配其中一個(gè)異常類并執(zhí)行catch塊代碼,而不會(huì)再執(zhí)行別的catch塊,并且匹配catch語(yǔ)句的順序是由上到下。
          throw、throws關(guān)鍵字
          throw關(guān)鍵字是用于方法體內(nèi)部,用來拋出一個(gè)Throwable類型的異常。如果拋出了檢查異常,則還應(yīng)該在方法頭部聲明方法可能拋出的異常類型。該方法的調(diào)用者也必須檢查處理拋出的異常。如果所有方法都層層上拋獲取的異常,最終JVM會(huì)進(jìn)行處理,處理也很簡(jiǎn)單,就是打印異常消息和堆棧信息。如果拋出的是Error或RuntimeException,則該方法的調(diào)用者可選擇處理該異常。
          throws關(guān)鍵字用于方法體外部的方法聲明部分,用來聲明方法可能會(huì)拋出某些異常。僅當(dāng)拋出了檢查異常,該方法的調(diào)用者才必須處理或者重新拋出該異常。當(dāng)方法的調(diào)用者無力處理該異常的時(shí)候,應(yīng)該繼續(xù)拋出,而不是囫圇吞棗一般在catch塊中打印一下堆棧信息做個(gè)勉強(qiáng)處理。

          三、 異常處理的一般原則
          1>
          能處理就早處理,拋出不去還不能處理的就想法消化掉或者轉(zhuǎn)換為RuntimeException處理。因?yàn)閷?duì)于一個(gè)應(yīng)用系統(tǒng)來說,拋出大量異常是有問題的,應(yīng)該從程序開發(fā)角度盡可能的控制異常發(fā)生的可能。
          2>對(duì)于檢查異常,如果不能行之有效的處理,還不如轉(zhuǎn)換為RuntimeException拋出。這樣也讓上層的代碼有選擇的余地――可處理也可不處理。
          3>對(duì)于一個(gè)應(yīng)用系統(tǒng)來說,應(yīng)該有自己的一套異常處理框架,這樣當(dāng)異常發(fā)生時(shí),也能得到統(tǒng)一的處理風(fēng)格,將優(yōu)雅的異常信息反饋給用戶。



          天天學(xué)習(xí),好好向上——

          posted on 2008-10-09 11:10 東頭bing阿頭 閱讀(2737) 評(píng)論(0)  編輯  收藏 所屬分類: Java EE

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           



          主站蜘蛛池模板: 定远县| 梁河县| 永嘉县| 渑池县| 理塘县| 平泉县| 措勤县| 康保县| 江都市| 嘉禾县| 青川县| 杂多县| 阿勒泰市| 嵊泗县| 根河市| 辽宁省| 呼和浩特市| 宣汉县| 三亚市| 泗阳县| 涞水县| 龙陵县| 温州市| 黄陵县| 博爱县| 阿尔山市| 二手房| 息烽县| 三河市| 汝城县| 子洲县| 苍南县| 洞口县| 新源县| 石狮市| 阳新县| 石阡县| 阿坝县| 荥经县| 水城县| 罗江县|