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

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

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

    工作小驛

    Ninja!

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks
    1. 異常機制

    1.1

    異常機制是指當程序出現(xiàn)錯誤后,程序如何處理。具體來說,異常機制提供了程序退出的安全通道。當出現(xiàn)錯誤后,程序執(zhí)行的流程發(fā)生改變,程序的控制權轉(zhuǎn)移到異常處理器。

    1.2

    傳統(tǒng)的處理異常的辦法是,函數(shù)返回一個特殊的結果來表示出現(xiàn)異常(通常這個特殊結果是大家約定俗稱的),調(diào)用該函數(shù)的程序負責檢查并分析函數(shù)返回的結果。這樣做有如下的弊端:例如函數(shù)返回-1代表出現(xiàn)異常,但是如果函數(shù)確實要返回-1這個正確的值時就會出現(xiàn)混淆;可讀性降低,將程序代碼與處理異常的代碼混爹在一起;由調(diào)用函數(shù)的程序來分析錯誤,這就要求客戶程序員對庫函數(shù)有很深的了解。

    1.3 異常處理的流程

    1.3.1 遇到錯誤,方法立即結束,并不返回一個值;同時,拋出一個異常對象

    1.3.2 調(diào)用該方法的程序也不會繼續(xù)執(zhí)行下去,而是搜索一個可以處理該異常的異常處理器,并執(zhí)行其中的代碼


    2 異常的分類

    2.1 異常的分類

    2.1.1

    異常的繼承結構:基類為Throwable,Error和Exception繼承Throwable,RuntimeException和IOException等繼承Exception,具體的RuntimeException繼承RuntimeException。

    2.1.2

    Error和RuntimeException及其子類成為未檢查異常(unchecked),其它異常成為已檢查異常(checked)。

    2.2 每個類型的異常的特點

    2.2.1 Error體系

    Error類體系描述了Java運行系統(tǒng)中的內(nèi)部錯誤以及資源耗盡的情形。應用程序不應該拋出這種類型的對象(一般是由虛擬機拋出)。如果出現(xiàn)這種錯誤,除了盡力使程序安全退出外,在其他方面是無能為力的。所以,在進行程序設計時,應該更關注Exception體系。

    2.2.2 Exception體系

    Exception體系包括RuntimeException體系和其他非RuntimeException的體系

    2.2.2.1 RuntimeException

    RuntimeException體系包括錯誤的類型轉(zhuǎn)換、數(shù)組越界訪問和試圖訪問空指針等等。處理RuntimeException的原則是:如果出現(xiàn)RuntimeException,那么一定是程序員的錯誤。例如,可以通過檢查數(shù)組下標和數(shù)組邊界來避免數(shù)組越界訪問異常。

    2.2.2.2 其他(IOException等等)

    這類異常一般是外部錯誤,例如試圖從文件尾后讀取數(shù)據(jù)等,這并不是程序本身的錯誤,而是在應用環(huán)境中出現(xiàn)的外部錯誤。

    2.3 與C++異常分類的不同

    2.3.1

    其實,Java中RuntimeException這個類名起的并不恰當,因為任何異常都是運行時出現(xiàn)的。(在編譯時出現(xiàn)的錯誤并不是異常,換句話說,異常就是為了解決程序運行時出現(xiàn)的的錯誤)。

    2.3.2

    C++中l(wèi)ogic_error與Java中的RuntimeException是等價的,而runtime_error與Java中非RuntimeException類型的異常是等價的。

    3 異常的使用方法


    3.1 聲明方法拋出異常

    3.1.1 語法:throws(略)

    3.1.2 為什么要聲明方法拋出異常?

    方法是否拋出異常與方法返回值的類型一樣重要。假設方法拋出異常確沒有聲明該方法將拋出異常,那么客戶程序員可以調(diào)用這個方法而且不用編寫處理異常的代碼。那么,一旦出現(xiàn)異常,那么這個異常就沒有合適的異常控制器來解決。

    3.1.3 為什么拋出的異常一定是已檢查異常?

    RuntimeException與Error可以在任何代碼中產(chǎn)生,它們不需要由程序員顯示的拋出,一旦出現(xiàn)錯誤,那么相應的異常會被自動拋出。而已檢查異常是由程序員拋出的,這分為兩種情況:客戶程序員調(diào)用會拋出異常的庫函數(shù)(庫函數(shù)的異常由庫程序員拋出);客戶程序員自己使用throw語句拋出異常。遇到Error,程序員一般是無能為力的;遇到RuntimeException,那么一定是程序存在邏輯錯誤,要對程序進行修改(相當于調(diào)試的一種方法);只有已檢查異常才是程序員所關心的,程序應該且僅應該拋出或處理已檢查異常。

    3.1.4

    注意:覆蓋父類某方法的子類方法不能拋出比父類方法更多的異常,所以,有時設計父類的方法時會聲明拋出異常,但實際的實現(xiàn)方法的代碼卻并不拋出異常,這樣做的目的就是為了方便子類方法覆蓋父類方法時可以拋出異常。

    3.2 如何拋出異常

    3.2.1 語法:throw(略)

    3.2.2 拋出什么異常?

    對于一個異常對象,真正有用的信息時異常的對象類型,而異常對象本身毫無意義。比如一個異常對象的類型是ClassCastException,那么這個類名就是唯一有用的信息。所以,在選擇拋出什么異常時,最關鍵的就是選擇異常的類名能夠明確說明異常情況的類。

    3.2.3

    異常對象通常有兩種構造函數(shù):一種是無參數(shù)的構造函數(shù);另一種是帶一個字符串的構造函數(shù),這個字符串將作為這個異常對象除了類型名以外的額外說明。

    3.2.4

    創(chuàng)建自己的異常:當Java內(nèi)置的異常都不能明確的說明異常情況的時候,需要創(chuàng)建自己的異常。需要注意的是,唯一有用的就是類型名這個信息,所以不要在異常類的設計上花費精力。

    3.3 捕獲異常

    如果一個異常沒有被處理,那么,對于一個非圖形界面的程序而言,該程序會被中止并輸出異常信息;對于一個圖形界面程序,也會輸出異常的信息,但是程序并不中止,而是返回用Ы緱媧硌分小?BR> 3.3.1 語法:try、catch和finally(略)

    控制器模塊必須緊接在try塊后面。若擲出一個異常,異常控制機制會搜尋參數(shù)與異常類型相符的第一個控制器隨后它會進入那個catch

    從句,并認為異常已得到控制。一旦catch 從句結束對控制器的搜索也會停止。

    3.3.1.1 捕獲多個異常(注意語法與捕獲的順序)(略)

    3.3.1.2 finally的用法與異常處理流程(略)

    3.3.2 異常處理做什么?

    對于Java來說,由于有了垃圾收集,所以異常處理并不需要回收內(nèi)存。但是依然有一些資源需要程序員來收集,比如文件、網(wǎng)絡連接和圖片等資源。

    3.3.3 應該聲明方法拋出異常還是在方法中捕獲異常?

    原則:捕捉并處理哪些知道如何處理的異常,而傳遞哪些不知道如何處理的異常

    3.3.4 再次拋出異常

    3.3.4.1 為什么要再次拋出異常?

    在本級中,只能處理一部分內(nèi)容,有些處理需要在更高一級的環(huán)境中完成,所以應該再次拋出異常。這樣可以使每級的異常處理器處理它能夠處理的異常。

    3.3.4.2 異常處理流程

    對應與同一try塊的catch塊將被忽略,拋出的異常將進入更高的一級。

    4 關于異常的其他問題

    4.1 過度使用異常

    首先,使用異常很方便,所以程序員一般不再愿意編寫處理錯誤的代碼,而僅僅是簡簡單單的拋出一個異常。這樣做是不對的,對于完全已知的錯誤,應該編寫處理這種錯誤的代碼,增加程序的魯棒性。另外,異常機制的效率很差。

    4.2 將異常與普通錯誤區(qū)分開

    對于普通的完全一致的錯誤,應該編寫處理這種錯誤的代碼,增加程序的魯棒性。只有外部的不能確定和預知的運行時錯誤才需要使用異常。

    4.3 異常對象中包含的信息

    一般情況下,異常對象唯一有用的信息就是類型信息。但使用異常帶字符串的構造函數(shù)時,這個字符串還可以作為額外的信息。調(diào)用異常對象的getMessage()、toString()或者printStackTrace()方法可以分別得到異常對象的額外信息、類名和調(diào)用堆棧的信息。并且后一種包含的信息是前一種的超集
    posted on 2007-09-20 15:55 王君 閱讀(1183) 評論(1)  編輯  收藏 所屬分類: J2SE

    Feedback

    # re: Java異常處理機制的詳細講解和使用技巧 2007-09-27 19:30 千里冰封
    異常機制也須好好掌握  回復  更多評論
      

    主站蜘蛛池模板: 怡红院亚洲怡红院首页| 国产三级在线观看免费| 亚洲午夜无码久久久久| 免费一级毛片在线播放视频免费观看永久 | 最近的免费中文字幕视频| 亚洲精品美女网站| 大香人蕉免费视频75| 亚洲人成电影网站色| 国产成人高清精品免费鸭子| 国产亚洲精彩视频| 久久久久亚洲AV无码专区桃色| 人成免费在线视频| 亚洲成a人片77777kkkk| 99在线观看精品免费99| 亚洲人成网男女大片在线播放| 成年美女黄网站18禁免费| 国产成人+综合亚洲+天堂| 国产亚洲精品成人a v小说| 全免费a级毛片免费看| 91亚洲国产成人久久精品网址| AV片在线观看免费| 国产在亚洲线视频观看| 亚洲色偷偷综合亚洲AVYP| 色欲国产麻豆一精品一AV一免费| 亚洲日韩在线视频| 国产小视频在线观看免费| 韩国免费A级毛片久久| 亚洲欧洲自拍拍偷午夜色| 永久免费bbbbbb视频| 三级黄色免费观看| 亚洲熟妇无码久久精品| 四虎影视永久免费观看| 久久狠狠躁免费观看| 亚洲精品乱码久久久久久V| 国产国拍亚洲精品福利| 99精品视频在线观看免费播放 | 亚洲精品福利视频| 国产男女猛烈无遮档免费视频网站| igao激情在线视频免费| 亚洲H在线播放在线观看H| 亚洲偷自拍拍综合网|