一、什麼是異常
1、異常的概念:程序中出現的錯誤
2、生活中的異常:什麼是異常,正常的反義詞。
趙日天開車去上班,正常情況從家到公司大概30分鐘。
異常是不可避免的,所以我們預先有應對的方法。
堵車---繞路、下車跑去機場。
車禍---報保險、報警
車子拋錨---24小時救援、拖車
沒油---搞個瓶子加油去
碰瓷---報警
早上起來開車去公司
}catch(堵車異常 d){
d.堵車的具體信息 //輸出堵車具體信息,看要怎麼處理
System.out.println("繞路吧");
}catch(車禍 h){
h.車禍的具體信息 //輸出堵車具體信息,看要怎麼處理
System.out.println("報110、120急救");
}
1、系統錯誤。(海嘯、地震、塘沽大爆炸,O了,啥也不想了,命都沒了,你還去啥公司)
(Error) 虛擬機內存溢出,系統崩潰。不能捕獲處理。(無法用try...catch...捕獲處理)
編譯時錯誤(不是異常):語法錯誤,不能通過編譯
(MyEclipse直接以紅線的形式提示)(無法用try...catch...捕獲處理)
×××異常,通常意義上指的都是 程序運行異常×××
程序運行異常又可分爲:
*系統異常:違反了Java已經定義好的一些規範,如輸入不匹配異常,除數爲0,數組越界等
java.util.InputMismatchException :輸入不匹配異常
Exception in thread "main" java.lang.ArithmeticException: / by zero 算術異常
*自定義異常:違反了程序員自己定義的一些規範,如年齡只能在0-100,輸入項只能是1-3等。
程序終止(沒運行完就崩潰了),並在控制檯顯示錯誤的詳細描述信息(車禍,)
System.out.println(1);
int a = 1/0;
System.out.println(2);
try :用來監視有可能出現異常的代碼塊。當出現異常時將異常拋出到catch(可能出現異常的代碼)
catch:當出現異常時,負責處理異常的代碼塊,try中一旦有異常會自動跳轉到這裏(異常處理)
finally:無論是否有異常,都會執行的代碼(清理資源的代碼)
使用異常對象來獲得異常信息。
a.運行時異常的常見種類:
數組下標越界 :java.lang.ArrayIndexOutOfBoundsException
除數爲0 :java.lang.ArithmeticException
空指針異常:java.lang.NullPointExcpeiton
輸入格式錯誤:java.util.InputMismatchException
連不上網絡:
打不開文件:
......
b.異常的繼承體系:
見圖片文件。
系統異常又可分爲運行時異常與資源訪問異常(文件操作,數據庫讀取等)
c.多重catch語句:
當一段代碼中可能出現多種類型異常時,可以接上多個catch塊分別處理不同類型的異常。系統會自動選擇最適合的catch塊來處理異常。
可以處理多種異常,但每次只會處理一個。
一般在最後加上處理Exception類型的異常表示其他未知錯誤。
d.try catch 可以嵌套使用
2、對異常的處理關係的程序的健壯性。
3、使用try...catch...finally來處理可能出現異常的代碼。
六、自定義異常的處理
a.自定義異常類,繼承與Exception,在構造函數中使用super(String)向父類傳遞一個表示異常信息的字符串。
b.拋出自定義異常對象的方式:throw new XXXException().
c.處理自定義異常的方式:catch 等同與處理系統異常。
1、throw關鍵字:年齡、身高負數等Java虛擬機判斷不了的異常,自己定義一個異常對象,然後用throw拋出
2、throws關鍵字
a.作用:在Java中允許在一個函數內,如果有異常函數內部不處理而使用throws關鍵字表示該函數會拋出的異常類型。這些異常將交給調用該函數的其他函數負責處理
b.其他函數調用時則必須處理 或者可以使用throws繼續向上層調用者拋出。
c.所有繼承於RunTimeException的異常不可用throws拋出,在函數內部必須處理。
異常又分爲:
uncheck Exception: RuntimeException
選擇:1、可以在方法中用try...catch...捕捉處理
2、在方法後用throws聲明拋出異常,由調用該方法的其他方法負責處理