11、異常處理
程式問題:
1、錯誤(Error):語法錯誤和執行階段錯誤;
執行階段錯誤指的是由於程式錯誤導致啟動並執行環境崩潰或硬體出現問題。這樣的錯誤是無法用代碼解決問題的。
2、異常(Exception):編譯期異常/檢查異常(checked)和運行期異常/未檢查異常(unchecket)。
異常能用代碼解決問題。
異常的尋找:從上往下尋找自己寫的第一行代碼。
處理異常:
1、先驗判定:在異常出現之前;
2、異常處理機制(後捕):在異常出現後(try(試一試)-catch(捕獲)-finally(總會執行的代碼))
Throwable類:
Thorwable是所有程式問題的父類,它有兩個子類分別是:Error和Exception。
Error是所有錯誤的父類;
Exception是所有異常的父類。
而Exception裡面又包括runtimeException(所有運行時異常的父類)和非runtimeException編譯時間異常。
由於所有異常都繼承與Throwable類,所以我們還可以在任何被捕獲的異常上調用Throwable類的方法。
1、public String getMessage():返回關於已發生的異常的詳細資料。這個方法在Throwable類的構造方法中被初始化。
2、public Thowable getCause():返回Thowable對象所描述的異常產生的原因。這個原因由Throwable的構造方法或者initCause()方法進行初始化。
3、public String toString():返回Thorwable類的簡短描述。
捕獲異常:
編寫try、catch快:
try不能單獨存在,後面必須跟catch或者finally。
try{
有可能出現異常的代碼書寫在這裡
}catch(異常變數聲明,作用是判斷這個catch出現的是那種異常){
}
一旦try出現異常後面的語句將不執行,跳到catch塊處理異常,如沒有異常則跳過catch代碼塊。
多個catch塊:
多個catch是按順序匹配的,誰的引用指向catch塊就匹配誰。
當catch後面跟多個catch時,catch中捕獲的異常有繼承關係時子類寫前面父類寫後面。
finally關鍵字:
finally是不管怎麼樣總會執行的代碼,在return和break之前執行。通常是資源的關閉動作和記憶體清理動作。input.next(); 取走緩衝區資料,處理語句。
代碼層級只有System.exit(0);關閉虛擬機器能阻止finally的動作。
異常處理及聲明規則:
instanceof也可以用於判斷異常。
throws關鍵字:
作用:警告方法調用者這個方法有可能出現異常。寫在方法聲明後面花括弧前面,也可用於main方法。異常類型可以是多個的,中間用逗號分隔。
拋出異常:
使用throw關鍵字來拋出異常,這個異常可以是一個新的異常執行個體,也可以是一個我們剛剛捕獲的異常。throw語句將導致當前代碼立即停止執行,而且異常將被拋給方法調
用棧的前一個方法,也就是方法的調用者。
throww new ArrayIndexOutOfBoundsException(5);
方法遇到throw後會發生異常,不管try塊,如果非runtimeException要寫在throws裡。
關鍵字throws用於聲明異常,它只用在方法簽名中。而關鍵字throw用於拋出異常,它可以用在任何我們想要拋出異常的地方。
方法重寫與異常:
子方法不能拋出比父方法更多的異常。(其中更多包括了數量和範圍)
異常拋出機制:
1、java虛擬機器會產生該異常的對象;
2、然後交個報異常的方法;
3、如果該方法沒有處理;
4、則拋給方法的調用者;
5、如果還沒有處理則拋給調用者的調用者;
6、最終拋給虛擬機器,終止程式。
使用者自訂異常:
1.必須繼承Exception類;
2、必須有3個帶參構造(3個):1、Exception2、Throwable3、String(針對業務異常);
3、在一個方法中拋出異常;
4、在另一個方法中捕獲並處理異常。