異常
異常是指在程序的運(yùn)行過(guò)程中所發(fā)生的不正常的情況著洼,它會(huì)中斷正在運(yùn)行的程序
異常處理
try/catch
.....
try{
? ??????//有可能發(fā)生異常的代碼
}catch(異常類型 e){
? ? //若發(fā)生異常,catch負(fù)責(zé)捕獲(匹配)并處理異常
? ? //若沒(méi)有發(fā)生異常豹悬,則跳過(guò)catch
}
.....
Exception是所有異常類的直接或間接父類
異常類型不匹配時(shí)瞻佛,程序中斷運(yùn)行
try/catch/finally
.....
try{
? ??????//有可能發(fā)生異常的代碼
}catch(異常類型 e){
????????//若發(fā)生異常伤柄,catch負(fù)責(zé)捕(匹配)并處理異常
????????//若沒(méi)有發(fā)生異常,則跳過(guò)catch秤朗,執(zhí)行finally
}finally{
????//finally 用于進(jìn)行收尾工作(關(guān)閉數(shù)據(jù)庫(kù)笔喉、文件,釋放內(nèi)存等資源)
}
.....
不管是否發(fā)生異常作谭,finally都執(zhí)行
執(zhí)行finally前折欠,system.exit(0) 正常退出jvm秧倾,finally不會(huì)執(zhí)行
catch可以省略,變成try/finally塊
return在try/catch/finally塊中的執(zhí)行順序
順序執(zhí)行后返回執(zhí)行return
異常的分類
Throwable類是 Java 語(yǔ)言中所有錯(cuò)誤(Error)或異常(Exception)的父類
Error類表示錯(cuò)誤類农猬。僅靠程序本身無(wú)法恢復(fù)的嚴(yán)重錯(cuò)誤
Exception 類表示異常類售淡,可以通過(guò)java 異常處理機(jī)制處理。
異常分為兩種情況
RuntimeException:????運(yùn)行時(shí)異常揍堕。不要求程序必須做出處理汤纸。是所有運(yùn)行時(shí)異常的父類。
CheckedException:????檢查時(shí)異常楞慈。要求程序必須處理啃擦,不處理編譯不通過(guò)。
運(yùn)行時(shí)異常和檢查時(shí)異常的區(qū)別
運(yùn)行時(shí)異常:包括RuntimeException及其所有子類聚霜。不要求程序必須對(duì)它們作出處理,比如InputMismatchException弟劲、ArithmeticException姥芥、NullPointerException等。即使沒(méi)有使用try-catch或throws進(jìn)行處理,仍舊可以進(jìn)行編譯和運(yùn)行虱咧。如果運(yùn)行時(shí)發(fā)生異常腕巡,會(huì)輸出異常的堆棧信息并中止程序執(zhí)行。
Checked異常(非運(yùn)行時(shí)異常):除了運(yùn)行時(shí)異常外的其他異常類都是Checked異常绘沉。程序必須捕獲或者聲明拋出這種異常,否則出現(xiàn)編譯錯(cuò)誤择懂,無(wú)法通過(guò)編譯困曙。
聲明異常
一個(gè)方法可能存在異常谦去,而此時(shí)自身又無(wú)法更好的處理,可以交給外界處理鳄哭。此時(shí)用throws聲明并拋出異常妆丘。
如:public? ?staticint?? div(inta,int b)????throws????ArithmeticException{
}
用throws聲明后,調(diào)用處需要處理該異常珊膜,若是不知道如何處理異常宣脉,可繼續(xù)聲明異常,這個(gè)過(guò)程稱為異常上拋
聲明異常和方法重載的關(guān)系
方法重載與聲明異常無(wú)關(guān)
聲明異常和方法重寫(xiě)的關(guān)系
1.父類方法聲明了異常竹祷,子類可不聲明任何異常
可以認(rèn)為父類方法拋出異常,子類在重寫(xiě)過(guò)程中把該異常處理掉了感憾,所以子類方法不用聲明異常令花。
2.父類聲明了異常(檢測(cè)時(shí)或運(yùn)行時(shí)),子類聲明完全一樣的異常
手動(dòng)拋出異常
除了系統(tǒng)自動(dòng)拋出異常外,有些問(wèn)題需要開(kāi)發(fā)者手動(dòng)拋出異常嫂沉。
而手動(dòng)拋出異常需要使用關(guān)鍵字throw
public class Student {
???? private String name;
???? private String gender;
???? public String getName() {
???????? return name;
???? }
???? public void? setName(String name) {
???????? this.name = name;
???? }
???? public String getGender() {
???????? return gender;
???? }
???? public void? setGender(String gender) throws? Exception{
???????? if(gender.equals("男") || gender.equals("女")) {????????????
????????????? this.gender = gender;
???????? }else {
????????????? throw new Exception("性別不合法!");
???????? }
???? }
???? public? Student(String name, String gender) {
? ? ? ? ? ? ??super();
? ? ? ? ? ? ??this.name = name;
???? ???????? this.gender = gender;
???? }
???? public? Student() {
???????? super();
???? }
}
--------------------------------------------
public class Test01 {
???? public static void? main(String[] args){
???????? Studentstu = new Student();
???????? stu.setName("二狗");
???????? try {
????????????? stu.setGender("xxx");
???????? }catch (Exception e) {
????????????? System.out.println(e.getMessage());
???????? }
???? }
}
自定義異常
如果開(kāi)發(fā)者需要手動(dòng)拋出的異常在系統(tǒng)不存在,可以自定義異常慎王。
如果要自定義異常,首先要確定異常類型蜀漆,如果異常是運(yùn)行時(shí)異常漫蛔,必須繼承RuntimeException或其子類;如果異常是檢查時(shí)異常,必須繼承Exception或其子類蠕嫁。
異常的命名方式毯盈,參考系統(tǒng)命名方式,以Exception結(jié)尾赘阀。
public classAgeExceptionextends Exception{
???? public AgeException(){
???????? super();
???? }
???? publicAgeException(Stringmessage) {
???????? super(message);
???? }
}