Java異常處理(非常全面)

sust_ly發表於2018-07-31

異常
    (1)程式執行過程中的不正常現象就叫異常。
    (2)導致程式執行不正常的現象有很多,所以,就有很多的異常物件。
       而這些異常物件存在著共性的內容,所以,可以不斷的進行抽取。最終形成了異常的體系結構。
       異常體系的根類是:Throwable
       Throwable:
        |--Error:重大的問題,我們處理不了。也不需要編寫程式碼處理。比如說記憶體溢位。
        |--Exception:一般性的錯誤,是需要我們編寫程式碼進行處理的。
            |--RuntimeException:執行時異常,這個我們也不需要處理。
                                其實就是為了讓他在執行時出問題,然後我們回來修改程式碼。
    (3)異常的分類        
        異常有兩種:
        編譯時被檢測異常:
            該異常在編譯時,如果沒有處理(沒有拋也沒有try),編譯失敗。
            該異常被標識,代表這可以被處理。
        執行時異常(編譯時不檢測)
            在編譯時,不需要處理,編譯器不檢查。
            該異常的發生,建議不處理,讓程式停止。需要對程式碼進行修正。
    (4)異常體系的特點:
        異常體系中的所有類及其子類物件都具備可拋性。也就是說可以被throw和throws關鍵字所操作。
    (5)main方法是如何處理異常的。
        A:在main裡面編寫程式碼進行處理
        B:交給jvm自己進行處理。採用的是jvm的預設處理方式。
          其實就是相當於呼叫了異常物件的printStackTrace()方法。
    (6)Throwable類的學習
        getMessage():獲取異常資訊,返回字串。
        toString():獲取異常類名和異常資訊,返回字串。
        printStackTrace():獲取異常類名和異常資訊,以及異常出現在程式中的位置。返回值void。
    (7)異常的處理·
        A:try...catch...finally
        基本格式:
            try
            {
                可能出現異常的程式碼
            }
            catch(異常物件)
            {    
                異常處理程式碼
            }
            finally
            {
                釋放資源
            }
        
        變形格式:
            try...catch
            try...catch...catch...
            try...catch...catch...finally
        **多個異常同時被捕獲的時候,記住一個原則:
            先逮小的,再逮大的。
        **finally:永遠被執行,除非退出jvm。System.exit(0);
            面試題2個。
            ***:final,finally,finalize區別。
               final是最終的意思。它可以用於修飾類,成員變數,成員方法。
               它修飾的類不能被繼承,它修飾的變數時常量,它修飾的方法不能被重寫。

               finally:是異常處理裡面的關鍵字。
               它其中的程式碼永遠被執行。特殊情況:在執行它之前jvm退出。System.exit(0);

               finalize:是Object類中的一個方法。
               它是於垃圾回收器呼叫的方式。

            ***:假如catch中有return語句, finally裡中的程式碼會執行嗎?
               是在return前,還是在return後呢?
               會,在return前執行finally裡面的程式碼。
    (8)Exception和RuntimeException的區別
        A:Exception:一般性的錯誤,是需要我們編寫程式碼進行處理的。    
        B:RuntimeException:執行時異常,這個我們也不需要處理。
                       其實就是為了讓他在執行時出問題,然後我們回來修改程式碼。
            在用throws丟擲一個的時候,如果這個異常是屬於RuntimeException的體系的時候,
            我們在呼叫的地方可以不用處理。(RuntimeException和RuntimeException的子類)
            
            在用throws丟擲一個的時候,如果這個異常是屬於Exception的體系的時候,
            我們在呼叫的地方必須進行處理或者繼續丟擲。
    (9)自定義異常
        定義類繼承Exception或者RuntimeException
        1,為了讓該自定義類具備可拋性。
        2,讓該類具備操作異常的共性方法。
        class MyExcepiton extends Exception
        {
            MyExcepiton(){}

            MyExcepiton(String message)
            {
                super(message);
            }
        }

        class MyException extends RuntimeException
        {
            MyExcepiton(){}

            MyExcepiton(String message)
            {
                super(message);
            }
        }
    (10)throws和throw的區別
        A:有throws的時候可以沒有throw。
           有throw的時候,如果throw拋的異常是Exception體系,那麼必須有throws在方法上宣告。
        B:throws用於方法的宣告上,其後跟的是異常類名,後面可以跟多個異常類,之間用逗號隔開
           throw用於方法體中,其後跟的是一個異常物件名

 

轉自:Java SE總結文件