在 Java 中,所有的異常都有一個(gè)共同的祖先java.lang包中的 Throwable類(lèi)。Throwable: 有兩個(gè)重要的子類(lèi):Exception(異常) 和 Error(錯(cuò)誤) 甫恩,二者都是 Java 異常處理的重要子類(lèi),各自都包含大量子類(lèi)。
- Error(錯(cuò)誤):是程序無(wú)法處理的錯(cuò)誤匣砖,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題。大多數(shù)錯(cuò)誤與代碼編寫(xiě)者執(zhí)行的操作無(wú)關(guān)昏滴,而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問(wèn)題猴鲫。例如,Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)谣殊,當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí)拂共,將出現(xiàn) OutOfMemoryError。這些異常發(fā)生時(shí)姻几,Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止宜狐。
這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身、或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí)蛇捌,如Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)抚恒、類(lèi)定義錯(cuò)誤(NoClassDefFoundError)等。這些錯(cuò)誤是不可查的豁陆,因?yàn)樗鼈冊(cè)趹?yīng)用程序的控制和處理能力之 外柑爸,而且絕大多數(shù)是程序運(yùn)行時(shí)不允許出現(xiàn)的狀況。對(duì)于設(shè)計(jì)合理的應(yīng)用程序來(lái)說(shuō)盒音,即使確實(shí)發(fā)生了錯(cuò)誤表鳍,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中祥诽,錯(cuò)誤通過(guò)Error的子類(lèi)描述譬圣。
- Exception(異常):是程序本身可以處理的異常。
- Exception 類(lèi)有一個(gè)重要的子類(lèi)RuntimeException雄坪。
- RuntimeException 異常由Java虛擬機(jī)拋出厘熟。
- NullPointerException(要訪問(wèn)的變量沒(méi)有引用任何對(duì)象時(shí),拋出該異常)
- ArithmeticException(算術(shù)運(yùn)算異常维哈,一個(gè)整數(shù)除以0時(shí)绳姨,拋出該異常)和
- ArrayIndexOutOfBoundsException (下標(biāo)越界異常)。
注意:異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理阔挠,錯(cuò)誤是無(wú)法處理飘庄。
Throwable類(lèi)常用方法
- public string getMessage():返回異常發(fā)生時(shí)的詳細(xì)信息
- public string toString():返回異常發(fā)生時(shí)的簡(jiǎn)要描述
- public string getLocalizedMessage():返回異常對(duì)象的本地化信息。使用Throwable的子類(lèi)覆蓋這個(gè)方法购撼,可以聲稱本地化信息跪削。如果子類(lèi)沒(méi)有覆蓋該方法谴仙,則該方法返回的信息與getMessage()返回的結(jié)果相同
- public void printStackTrace():在控制臺(tái)上打印Throwable對(duì)象封裝的異常信息
異常處理總結(jié)
- try 塊:用于捕獲異常。其后可接零個(gè)或多個(gè)catch塊碾盐,如果沒(méi)有catch塊晃跺,則必須跟一個(gè)finally塊。
- catch 塊:用于處理try捕獲到的異常毫玖。
- finally 塊:無(wú)論是否捕獲或處理異常掀虎,finally塊里的語(yǔ)句都會(huì)被執(zhí)行。當(dāng)在try塊或catch塊中遇到return語(yǔ)句時(shí)孕豹,finally語(yǔ)句塊將在方法返回之前被執(zhí)行涩盾。
在以下4種特殊情況下十气,finally塊不會(huì)被執(zhí)行:
- 在finally語(yǔ)句塊中發(fā)生了異常励背。
- 在前面的代碼中用了System.exit()退出程序。
- 程序所在的線程死亡砸西。
- 關(guān)閉CPU叶眉。