異常數組
程序不正常的執行,報錯。Exception類框架
異常有父類:Throwable,Throwable又有子類Error和Exception。this
異常的分類:spa
Throwable:爲如下錯誤的父類。指針
Error:(錯誤通常比異常嚴重,通常爲虛擬機出現錯誤),Error類型的錯誤必須拋出解決不能捕獲!日誌
Exception:對象
RuntimeException(運行時異常):編譯經過,不強制處理,在程序運行時出現→ 不受檢查異常。繼承
算術異常、數組下標越界、空指針異常、遞歸
編譯期異常(除了RuntimeException其他都是編譯期異常):必須處理,要麼捕獲,要麼拋出。通常是語法錯誤,在進行編譯時就會報錯→ 受檢查異常.必須及時處理!內存
常見異常
Error:內存溢出錯誤(兩個方法之間遞歸調用);
異常的處理
不論是錯誤Error仍是異常Exception都是須要被處理。處理異常有兩種方式:
拋出throws 和捕獲try catch
throws:用法:在方法聲明後 即方法參數列表後,左大括號({)前用throws聲明要拋出的異常。throws 異常類名,支持同時拋出多個異常,也就是 throws 異常類名1,[異常類名2]….若是方法有多個異常須要拋出,可使用最大異常父類聲明(Exception)直接拋出Exception;
異常的注意事項以及如何使用異常處理:
有異常的方法怎麼使用:
1)方法內部的異常有try catch處理時:該方法能夠被正常調用。
2)方法聲明上有異常拋出時(throws):調用該方法時必須對該方法處理。
若是方法聲明上有異常拋出,重寫時應該注意
子類重寫有異常方法的時候,子類的方法拋出的異常範圍要比父類範圍小,要麼範圍相等、要麼沒有異常。
做用在於:聲明該方法/編譯或運行時可能拋出的異常種類。只要方法中有異常,不論是運行異常,仍是編譯異常,程序就會在該處中止,並拋出異常。
注意事項:運行時異常,能夠明確的在方法聲明上聲明要拋出的運行時異常,也能夠不聲明。編譯期異常必須處理。要麼拋出(throws)要麼捕獲(try catch)。
異常的本質:程序運行拋出的異常,實際上是方法聲明的異常類的對象。
throw
在方法體中,能夠明確顯示拋出哪一種異常。能夠準確地控制在什麼地方拋除異常。
語法:throw 異常對象(匿名對象的形式 new 異常類名()),若是throw後面拋出的異常對象是運行時異常,那麼能夠在方法聲明上聲明要拋出的異常,也能夠不聲明。若是throw拋出的是編譯期異常對象,必須強制處理該異常(聲明拋出或者捕獲)。
throw與throws異同
1)位置不一樣:throw在方法體中,throws是在方法聲明上。
2)做用不一樣:throw後是聲明拋除的異常對象,throws後聲明的是異常類類名。
3)寫法不一樣:throw後只能寫一個異常,throws後能夠寫多個對象名。
try catch
異常的另一種處理方式,叫作捕獲異常,在上線的項目中運用普遍,由於顯示拋出異常,程序就會在異常處中止,就會影響程序功能,可是捕獲異常能夠作到即便有異常可是程序還會繼續執行。捕獲異常後通常能夠將異常作成異常日誌,把捕獲的異常統一記錄,後續再進行修改。
Try catch能夠捕獲異常讓程序正常執行,可是try{}中的代碼,若是有異常的話,try中報錯後的代碼不執行,如圖:
語法:
try{
可能出現異常的代碼
}catch(要捕獲的異常類名 對象名){
捕獲以後乾的事情。
}[catch(要捕獲的異常類名2 對象名2){
捕獲後乾的事情。
}]
若是try中拋出的異常不是catct後面要捕獲的異常,就會繼續拋出異常,程序就會停下。
若是try中可能拋出多個異常,能夠寫多個catch 同時捕獲多個異常.可是寫多個catch麻煩,能夠直接捕獲最大的異常Exception。在捕獲Exception異常後,就不能再寫捕獲其子類異常,由於上一個Exception異常已經基本捕獲所有異常
publicstaticvoid main(String[] args) { try { //可能出現異常的代碼 System.out.println(1/0); }catch(ArithmeticException ari){ System.out.println(ari); System.out.println(ari.getMessage());//打印異常信息/將異常信息寫入日誌 //打印錯誤信息 ari.printStackTrace(); //獲取主要緣由,框架中會常常見Casuse, Cause在寫項目的時候常常用到,報錯會很是詳細 Throwable Masg = ari.getCause(); System.out.println(Masg); }//finally{}最終都要執行到的,可寫可不寫 } |
自定義異常
1)建立自定義異常類
2)繼承異常類(Exception、RuntimeException、Throwable(是最大的拋出異常類,其下面是Exception)繼承哪一個將擁有那個的特性。例如繼承RuntimeException及其子類就有運行時異常的特色。
3)寫帶(String)參數的構造方法用於將異常信息經過super(messags)傳遞給父類.
用throw拋出異常程序會直接中止,因此建議用try捕獲異常,可是捕獲異常的時候因爲自定義異常中並無定義相似除數爲0、下標越界等自動拋出異常的方法,因此須要捕獲本身拋出的異常相似於:
在此set方法被調用的時候,會進行以下的異常捕捉 publicvoid setAge(intage) { if(age >150) { try { //若是年齡大於150,執行下面的一句話,必定會拋出異常 thrownew AgeGT150Exception(""); //捕獲 AgeGt150Exception類的異常 }catch(AgeGT150Exception ag) { //捕獲到後的操做 ag = new AgeGT150Exception("年級大於150"); System.out.println(ag); } }elseif(age < 0) { try { thrownew AgeLT0Exception(""); }catch(AgeLT0Exception ag) { ag = new AgeLT0Exception("年齡小於0"); System.out.println(ag); } }else { this.age = age; } }
//異常類 publicclassAgeGT150Exceptionextends RuntimeException{ public AgeGT150Exception(String massge) { super(massge); } } |