關(guān)于java中的異常處理簡析
異常類的頂級父類牙瓢,throwable,一個(gè)對象只有是throwable類的實(shí)例他才能被異常機(jī)制識別
throwable有派生除了Error跟Exception類
Error以及它的子類代表的是JVM本身的錯(cuò)誤怖侦,錯(cuò)誤不能通過程序員通過代碼來處理
Exception是異常處理的核心
根據(jù)javac對異常處理的要求税弃,將異常分為兩大類
非檢查異常(Unchecked exception)和檢查異常(checked exception)
非檢查異常(unckecked exception):Error 和 RuntimeException 以及他們的子類刀荒。javac在編譯時(shí)葵袭,不會(huì)提示和發(fā)現(xiàn)這樣的異常暇唾,不要求在程序處理這些異常条摸。所以如果愿意,我們可以編寫代碼處理(使用try…catch…finally)這樣的異常覆旭,也可以不處理退子。對于這些異常,我們應(yīng)該修正代碼型将,而不是去通過異常處理器處理 寂祥。這樣的異常發(fā)生的原因多半是代碼寫的有問題。如除0錯(cuò)誤ArithmeticException茶敏,錯(cuò)誤的強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤ClassCastException壤靶,數(shù)組索引越界ArrayIndexOutOfBoundsException,使用了空對象NullPointerException等等惊搏。
檢查異常(checked exception):除了Error 和 RuntimeException的其它異常贮乳。javac強(qiáng)制要求程序員為這樣的異常做預(yù)備處理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch語句捕獲它并處理恬惯,要么用throws子句聲明拋出它向拆,否則編譯不會(huì)通過。這樣的異常一般是由程序的運(yùn)行環(huán)境導(dǎo)致的酪耳。因?yàn)槌绦蚩赡鼙贿\(yùn)行在各種未知的環(huán)境下浓恳,而程序員無法干預(yù)用戶如何使用他編寫的程序,于是程序員就應(yīng)該為這樣的異常時(shí)刻準(zhǔn)備著碗暗。如SQLException , IOException,ClassNotFoundException 等颈将。
在編寫代碼處理異常時(shí),對于檢查異常言疗,有2種不同的處理方式:使用try…catch…finally語句塊處理它晴圾。或者噪奄,在函數(shù)簽名中使用throws 聲明交給函數(shù)調(diào)用者caller去解決死姚。
try…catch…finally語句塊
1人乓、try塊中的局部變量和catch塊中的局部變量(包括異常變量),以及finally中的局部變量都毒,他們之間不可共享使用色罚。
2、每一個(gè)catch塊用于處理一個(gè)異常账劲。異常匹配是按照catch塊的順序從上往下尋找的戳护,只有第一個(gè)匹配的catch會(huì)得到執(zhí)行。匹配時(shí)瀑焦,不僅運(yùn)行精確匹配姑尺,也支持父類匹配,因此蝠猬,如果同一個(gè)try塊下的多個(gè)catch異常類型有父子關(guān)系,應(yīng)該將子類異常放在前面统捶,父類異常放在后面榆芦,這樣保證每個(gè)catch塊都有存在的意義。
3喘鸟、java中匆绣,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。也就是說:當(dāng)一個(gè)函數(shù)的某條語句發(fā)生異常時(shí)什黑,這條語句的后面的語句不會(huì)再執(zhí)行崎淳,它失去了焦點(diǎn)。執(zhí)行流跳轉(zhuǎn)到最近的匹配的異常處理catch代碼塊去執(zhí)行愕把,異常被處理完后拣凹,執(zhí)行流會(huì)接著在“處理了這個(gè)異常的catch代碼塊”后面接著執(zhí)行。
有的編程語言當(dāng)異常被處理后恨豁,控制流會(huì)恢復(fù)到異常拋出點(diǎn)接著執(zhí)行嚣镜,這種策略叫做:resumption model of exception handling(恢復(fù)式異常處理模式 )
而Java則是讓執(zhí)行流恢復(fù)到處理了異常的catch塊后接著執(zhí)行,這種策略叫做:termination model of exception handling(終結(jié)式異常處理模式)
項(xiàng)目中強(qiáng)烈建議盡量手動(dòng)處理, 不要把異常交給jvm.
只有一種方法讓finally塊不執(zhí)行:System.exit()
1橘蜜、throws出現(xiàn)在方法函數(shù)頭菊匿;而throw出現(xiàn)在函數(shù)體。
2计福、throws表示出現(xiàn)異常的一種可能性跌捆,并不一定會(huì)發(fā)生這些異常;throw則是拋出了異常象颖,執(zhí)行throw則一定拋出了某種異常佩厚。
3、兩者都是消極處理異常的方式(這里的消極并不是說這種方式不好)力麸,只是拋出或者可能拋出異常可款,但是不會(huì)由函數(shù)去處理異常育韩,真正的處理異常由函數(shù)的上層調(diào)用處理。