基類 Throwable
兩個(gè)子類 Exception(異常) 和 Error(錯(cuò)誤)
兩者區(qū)別:異常程序本身可以處理,錯(cuò)誤無(wú)法處理
Exception兩大類
運(yùn)行時(shí)異常:RuntimeException及其子類異常。一般由程序邏輯錯(cuò)誤引起。
Java運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出,允許應(yīng)用程序忽略運(yùn)行異常。
非運(yùn)行時(shí)異常:RuntimeException以外的異常。語(yǔ)法角度是必須進(jìn)行處理的異常。
Java異常分類
可查異常:非運(yùn)行時(shí)異常
正確的程序運(yùn)行中容易出現(xiàn)的,情理可容的異常狀況。
特點(diǎn):Java編譯器會(huì)檢查它,必須用try-catch捕獲或throws聲明
不可查異常:運(yùn)行時(shí)異常和錯(cuò)誤
編譯器不要求強(qiáng)制處理
Java處理異常機(jī)制
異??偸窍缺粧伋觯蟊徊蹲?/p>
拋出異常:當(dāng)一個(gè)方法出現(xiàn)錯(cuò)誤引發(fā)異常時(shí),方法創(chuàng)建對(duì)象并交付運(yùn)行時(shí)系統(tǒng)。
異常對(duì)象中包含了異常類型和異常出現(xiàn)時(shí)的程序狀態(tài)等異常信息。運(yùn)行時(shí)系統(tǒng)負(fù)責(zé)尋找處置異常的代碼并執(zhí)行。
throws 一個(gè)方法可能出現(xiàn)異常,無(wú)能力處理,可在方法聲明處用throws子句來(lái)聲明
多個(gè)異常用逗號(hào)分隔method() throws Exception1,Exception2,Exception3…
僅當(dāng)拋出了異常,該方法的調(diào)用者才必須處理或重新拋出該異常。當(dāng)方法調(diào)用者無(wú)力處理該異常時(shí),應(yīng)當(dāng)繼續(xù)拋出。
throw 總是出現(xiàn)在函數(shù)體中,用來(lái)拋出一個(gè)Throwable型的異常。
程序會(huì)在throw語(yǔ)句后立即終止,后在包含它的所有try塊中從里向外尋找含有與其匹配的catch子句的try塊。
如果拋出了檢查異常,還應(yīng)在方法頭部聲明聲明方法可能拋出的異常類型。方法調(diào)用者也必須檢查處理拋出的異常。
若所有方法都層層上拋異常,最終jvm會(huì)處理。
捕獲異常:在方法拋出異常之后,運(yùn)行時(shí)系統(tǒng)轉(zhuǎn)為尋找合適的異常處理器。
潛在的異常處理器是異常發(fā)生時(shí)依次存留在調(diào)用棧中的方法的集合。當(dāng)異常處理器所能處理的異常類型與拋出的異常類型相符時(shí),即為合適的異常處理器。
運(yùn)行時(shí)系統(tǒng)從發(fā)生異常的方法開(kāi)始,依次回查調(diào)用棧中的方法,若找到合適異常處理器則執(zhí)行,否則運(yùn)行時(shí)系統(tǒng)終止。Java程序終止。
try-catch-finally
捕獲try塊內(nèi)運(yùn)行語(yǔ)句的異常
若無(wú)異常,try塊內(nèi)語(yǔ)句逐一執(zhí)行,跳過(guò)catch語(yǔ)句塊,執(zhí)行finally語(yǔ)句塊和其后的語(yǔ)句
若有異常,catch語(yǔ)句塊無(wú)處理此異常的情況,此異常將拋給JVM處理,finally語(yǔ)句塊里的語(yǔ)句仍會(huì)被執(zhí)行,但finally語(yǔ)句塊后語(yǔ)句不執(zhí)行 catch語(yǔ)句塊有處理此異常的情況,則跳到該catch語(yǔ)句塊執(zhí)行,其余catch塊不執(zhí)行,完畢后執(zhí)行finally語(yǔ)句塊
注意:
try或catch塊中遇到return語(yǔ)句也會(huì)執(zhí)行finally
對(duì)catch塊的檢查是順聲明順序依次檢查,若有某個(gè)子類異常需要處理,應(yīng)放在父類異常之前
finally不執(zhí)行情況:
JVM過(guò)早終止(調(diào)用System.exit())
finally塊中拋出一個(gè)未處理的異常
程序所在線程死亡
關(guān)閉CPU
自定義異常
繼承Exception類
調(diào)用方法與系統(tǒng)一致