異 常:★★★★
異常:就是不正常。程序在運行時出現的不正常狀況。其實就是程序中出現的問題。這個問題按照面向對象思想進行描述,並封裝成了對象。由於問題的產生有產生的緣由、有問題的名稱、有問題的描述等多個屬性信息存在。當出現多屬性信息最方便的方式就是將這些信息進行封裝。異常就是java按照面向對象的思想將問題進行對象封裝。這樣就方便於操做問題以及處理問題。java
出現的問題有不少種,好比角標越界,空指針等都是。就對這些問題進行分類。並且這些問題都有共性內容好比:每個問題都有名稱,同時還有問題描述的信息,問題出現的位置,因此能夠不斷的向上抽取。造成了異常體系。數組
--------java.lang.Throwable:
Throwable:可拋出的。
|--Error:錯誤,通常狀況下,不編寫針對性的代碼進行處理,一般是jvm發生的,須要對程序進行修正。
|--Exception:異常,能夠有針對性的處理方式jvm
不管是錯誤仍是異常,它們都有具體的子類體現每個問題,它們的子類都有一個共性,就是都以父類名才做爲子類的後綴名。函數
這個體系中的全部類和對象都具有一個獨有的特色;就是可拋性。指針
class ExceptionDemo{
public static void main(String[] args) {
//byte[] buf = new byte[10241024700];//java.lang.OutOfMemoryError內存溢出錯誤
}對象
在開發時,若是定義功能時,發現該功能會出現一些問題,應該將問題在定義功能時標示出來,這樣調用者就能夠在使用這個功能的時候,預先給出處理方式。繼承
如何標示呢?經過throws關鍵字完成,格式:throws 異常類名,異常類名...
這樣標示後,調用者,在使用該功能時,就必需要處理,不然編譯失敗。接口
處理方式有兩種:一、捕捉;二、拋出。
對於捕捉:java有針對性的語句塊進行處理。
try {
須要被檢測的代碼;
}
catch(異常類 變量名){
異常處理代碼;
}
fianlly{
必定會執行的代碼;內存
catch (Exception e) { //e用於接收try檢測到的異常對象。
System.out.println("message:"+e.getMessage());//獲取的是異常的信息。
System.out.println("toString:"+e.toString());//獲取的是異常的名字+異常的信息。
e.printStackTrace();//打印異常在堆棧中信息;異常名稱+異常信息+異常的位置。資源
異常處理原則:功能拋出幾個異常,功能調用若是進行try處理,須要與之對應的catch處理代碼塊,這樣的處理有針對性,拋幾個就處理幾個。
特殊狀況:try對應多個catch時,若是有父類的catch語句塊,必定要放在下面。
throw 和throws關鍵字的區別:
throw用於拋出異常對象,後面跟的是異常對象;throw用在函數內。
throws用於拋出異常類,後面跟的異常類名,能夠跟多個,用逗號隔開。throws用在函數上。
一般狀況:函數內容若是有throw,拋出異常對象,並無進行處理,那麼函數上必定要聲明,不然編譯失敗。可是也有特殊狀況。
異常分兩種:
1:編譯時被檢查的異常,只要是Exception及其子類都是編譯時被檢測的異常。
2:運行時異常,其中Exception有一個特殊的子類RuntimeException,以及RuntimeException的子類是運行異常,也就說這個異常是編譯時不被檢查的異常。
編譯時被檢查的異常和運行時異常的區別:
編譯被檢查的異常在函數內被拋出,函數必需要聲明,否編譯失敗。
聲明的緣由:是須要調用者對該異常進行處理。
運行時異常若是在函數內被拋出,在函數上不須要聲明。
不聲明的緣由:不須要調用者處理,運行時異常發生,已經沒法再讓程序繼續運行,因此,不讓調用處理的,直接讓程序中止,由調用者對代碼進行修正。
定義異常處理時,何時定義try,何時定義throws呢?
功能內部若是出現異常,若是內部能夠處理,就用try;
若是功能內部處理不了,就必須聲明出來,讓調用者處理。
自定義異常:當開發時,項目中出現了java中沒有定義過的問題時,這時就須要咱們按照java異常創建思想,將項目的中的特有問題也進行對象的封裝。這個異常,稱爲自定義異常。
對於除法運算,0做爲除數是不能夠的。java中對這種問題用ArithmeticException類進行描述。對於這個功能,在咱們項目中,除數除了不能夠爲0外,還不能夠爲負數。但是負數的部分java並無針對描述。因此咱們就須要自定義這個異常。
自定義異常的步驟:
1:定義一個子類繼承Exception或RuntimeException,讓該類具有可拋性。
2:經過throw 或者throws進行操做。
異常的轉換思想:當出現的異常是調用者處理不了的,就須要將此異常轉換爲一個調用者能夠處理的異常拋出。
try catch finally的幾種結合方式:
1,
try
catch
finally
這種狀況,若是出現異常,並不處理,可是資源必定關閉,因此try finally集合只爲關閉資源。
記住:finally頗有用,主要用戶關閉資源。不管是否發生異常,資源都必須進行關閉。
System.exit(0); //退出jvm,只有這種狀況finally不執行。
當異常出現後,在子父類進行覆蓋時,有了一些新的特色:
1:當子類覆蓋父類的方法時,若是父類的方法拋出了異常,那麼子類的方法要麼不拋出異常要麼拋出父類異常或者該異常的子類,不能拋出其餘異常。
2:若是父類拋出了多個異常,那麼子類在覆蓋時只能拋出父類的異常的子集。
注意:
若是父類或者接口中的方法沒有拋出過異常,那麼子類是不能夠拋出異常的,若是子類的覆蓋的方法中出現了異常,只能try不能throws。
若是這個異常子類沒法處理,已經影響了子類方法的具體運算,這時能夠在子類方法中,經過throw拋出RuntimeException異常或者其子類,這樣,子類的方法上是不須要throws聲明的。
常見異常:一、腳標越界異常(IndexOutOfBoundsException)包括數組、字符串;空指針異常(NullPointerException)二、類型轉換異常:ClassCastException三、沒有這個元素異常:NullPointerException四、不支持操做異常;異常要儘可能避免,若是避免不了,須要預先給出處理方式。好比家庭備藥,好比滅火器。