java 異常總結

### 爲什麼要處理異常
    1.1 異常的簡介。
        程序在運行過程中,沒有按照程序員期望的方式正常執行,出現不可預知的、非期望的情況叫異常。
    1.2 爲什麼要處理異常。
        1> 程序出現異常情況影響用戶體驗(小到用戶體驗差"錯誤輸出給客戶,Java.alng.NullPointerException什麼鬼???",大到"程序使用者沒發使用")
        2> 對於開發人員:小到程序出現異常並不影響主流程,知識在小細節上出現問題(空指針),大到死鎖系統崩潰duang掉。
        3> 對異常正確的使用是代碼優雅、健壯、安全性的提現。
        4> 一個螺絲有着影響全局的潛力。


### java異常的結構
    2.1 異常的結構體系。
    
    2.2 異常體系的介紹
        1> Throwable:所有java異常的根父類。Throwable有兩個子類Error和Exception。Error和Exception各自有大量的子類。
        2> Error:程序運行時,JVM出現錯誤,開發者無法通過代碼來處理。一旦出現Error,程序徹底掛掉,通常稱之爲"程序終結者"。比如熟悉的"OutOfMemoryError",由於程序沒有可以再使用的內存導致內存溢出,系統掛掉。一般程序中不應該拋出Error類的異常。
        3> Exception:程序在運行過程中發送不被期望的事件,應用層面最頂層異常類,程序本身可以處理的異常。異常處理的核心。
        4> 檢查異常(checked Exception):在項目編譯的時候就會報錯,無法通過編譯。需要立馬解決的異常。注:Java中並沒有一個名爲Checked Exception的類。該異常我們必須手動在代碼裏添加捕獲語句來處理該異常。
        5> 非檢查異常(unchecked Exception): RunTimeException 和 Error異常是非檢查異常。代碼在運行的時候可能出現異常,但是不會在編譯的時候報錯。注:Java中並沒有一個名爲UnChecked Exception的類。


### 異常的處理
    3.1 異常的處理機制
        1> 在 Java 應用程序中,異常處理機制爲:拋出異常,捕捉異常,處理異常。
        2> 在整個Java的異常處理中,實際上也是按照面向對象的方式進行處理的,處理步驟: 
        1. 一旦產生異常,則首先會產生一個異常類的實例化對象。 
        2. 在try語句中對此異常對象進行捕捉。 
        3. 產生的異常對象與catch語句中的各個異常類型進行匹配,如果匹配成功則執行catch語句中的代碼。
        3> 根據對象的多態性,子類的實例化對象可以直接使用父類的對象進行接收。 在異常的處理中,也是可以使用這樣的概念,因爲try中產生的是一個實例化對象,如果現在有一些其他的無法知道的異常,則可以最後使用Exception進行捕獲。 但是有一個注意點:捕獲更粗的異常要放在捕獲更細的異常之後(先捕獲子類異常,再父類異常)。
        4> 又出現了一個問題:既然所有的Exception對象都可以使用Exception接收,(都可以發生向上轉型關係)直接使用Exception捕獲異常不是更方便麼? 這樣雖然可以統一全部捕獲到異常,但是在一個精細的開發中,是不建議這樣使用的,因爲,這樣只是知道發生了異常,並不知道具體發生了什麼異常,所以,最好分別進行捕獲(先捕獲子類異常,再父類異常)。
        5> 又有一個問題:既然不過Exception是最方便的,那麼直接捕獲它的父類,Throwable豈不是更好?首先,這樣的做法是可以的,因爲Exception是Throwable的子類,但是正常的開發人員是不會這樣做的,因爲程序的try語句中永遠只會拋出Exception的子類對象,Throwable不僅僅有Exception這個子類,還有Error這個子類。
        6> 
        1.程序出現異常之後,如果沒有合理的處理的話,則會導致程序的中斷執行。 
        2.使用try—catch,和try–catch–finally,可以處理異常。finally將會作爲異常的統一出口,不管是否出現異常都會執行此語句。
        3.一個異常處理中,可以同時出現多個catch,但是捕獲更粗的異常要放在捕獲更細的異常之後,否則程序編譯會報錯(先捕獲子類異常,再父類異常)。
        4.在異常中,最大的類Throwable,分爲兩個子類,Exception,Error,其中Exception表示的是程序可以自己處理的異常,Error表示的是jvm錯誤,一般程序是無法處理的。         
        5.捕獲異常的時候,可以直接捕獲Exception,但是最好分開捕獲,如果所有的異常處理操作是一樣的話,則也可以直接捕獲Exception。
        6.每當異常產生之後,會在程序中產生一個異常類的實例化對象,之後使用此對象與catch中的異常類型進行匹配,如果匹配成功則執行catch語句中的內容,如果匹配不成功,則繼續向下匹配,如果都無法匹配成功,程序將出現中斷執行的情況。
        7> 總體來說,Java規定:對於可查異常必須捕捉、或者聲明拋出。允許忽略不可查的RuntimeException和Error。
    3.2 常見處理異常的幾個關鍵字(try--catch finally throw throws)
        1> try--catch--finally
            1. Java規定:對於可查異常必須捕捉、或者聲明拋出。允許忽略不可查的RuntimeException和Error
            2. try塊:用於捕獲異常。其後可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
            3. catch 塊:用於處理try捕獲到的異常。
            4. finally塊:無論是否捕獲或處理異常,finally塊裏的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。
            5. 匹配的原則是:如果拋出的異常對象屬於catch子句的異常類,或者屬於該異常類的子類,則認爲生成的異常對象與catch塊捕獲的異常類型相匹配。
            6. 不要在fianlly中使用return。不要在finally中拋出異常.減輕finally的任務,不要在finally中做一些其它的事情,finally塊僅僅用來釋放資源是最合適的。將盡量將所有的return寫在函數的最後面,而不是try---catch---finally中。
            7. 程序總將執行 finally 做爲結束,除了一下幾種情況:JVM 過早終止(調用 System.exit(int));在finally塊中拋出一個未處理的異常;計算機斷電、失火、或遭遇病毒攻擊。
        2> throw、throws
            1. throws出現在方法函數頭;而throw出現在函數體。
            2. throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是拋出了異常,執行throw則一定拋出了某種異常對象。
            3. 兩者都是消極處理異常的方式(這裏的消極並不是說這種方式不好),只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。
            4. Java中最大的頭,就是jvm,所以,如果在主方法中使用了throws關鍵字,則表示一切的異常都交給jvm去處理,其實,Java默認的異常處理也是使用jvm完成的。
    3.3 處理異常關鍵字的使用
        1> 一般程序中使用自定義的異常類。通常繼承Exception或者runTimeException
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章