Error
Java虛擬機(jī)無(wú)法解決的嚴(yán)重問題省容。如:JVM系統(tǒng)內(nèi)部錯(cuò)誤、資源耗盡等嚴(yán)重情況燎字。比如:StackOverflowError和OOM蓉冈。 一般不編寫針對(duì)性的代碼進(jìn)行處理。
Exception
分類:編譯時(shí)異常 和 運(yùn)行時(shí)異常
異常體系結(jié)構(gòu)
* java.lang.Throwable
*? ? ? -----java.lang.Error:一般不編寫針對(duì)性的代碼進(jìn)行處理轩触。
*? ? ? -----java.lang.Exception:可以進(jìn)行異常的處理
*? ? ? ? ? ? ? ------編譯時(shí)異常(checked)
*? ? ? ? ? ? ? ? ? ? ? ? ? -----IOException
*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -----FileNotFoundException
*? ? ? ? ? ? ? ? ? ? ? ? ? -----ClassNotFoundException
*? ? ? ? ? ------運(yùn)行時(shí)異常(unchecked,RuntimeException)
*? ? ? ? ? ? ? ? ? -----NullPointerException
*? ? ? ? ? ? ? ? ? -----ArrayIndexOutOfBoundsException
*? ? ? ? ? ? ? ? ? -----ClassCastException
*? ? ? ? ? ? ? ? ? -----NumberFormatException
*? ? ? ? ? ? ? ? ? -----InputMismatchException
*? ? ? ? ? ? ? ? ? -----ArithmeticException
面試題:常見的異常都有哪些寞酿?舉例說明
一、編譯時(shí)異常
二脱柱、運(yùn)行時(shí)異常
1.?NullPointerException :空指針
2. IndexOutOfBoundsException:角標(biāo)越界
1)ArrayIndexOutOfBoundsException:數(shù)組角標(biāo)越界
2)StringIndexOutOfBoundsException:字符角標(biāo)越界
3.?ClassCastException:類型轉(zhuǎn)換異常
4.?NumberFormatException:數(shù)字格式異常
5.?InputMismatchException:輸入不匹配異常
6.?ArithmeticException:算術(shù)異常
異常處理機(jī)制
異常處理其實(shí)是拋?zhàn)ツP?/b>
過程一
拋":程序在正常執(zhí)行的過程中伐弹,一旦出現(xiàn)異常,就會(huì)在異常代碼處生成一個(gè)對(duì)應(yīng)異常類的對(duì)象榨为。 并將此對(duì)象拋出惨好。一旦拋出對(duì)象以后,其后的代碼就不再執(zhí)行随闺。? ? ??
關(guān)于異常對(duì)象的產(chǎn)生:
① 系統(tǒng)自動(dòng)生成的異常對(duì)象
② 手動(dòng)的生成一個(gè)異常對(duì)象日川,并拋出(throw)
過程二:
"抓":可以理解為異常的處理方式:① try-catch-finally? ② throws
異常處理機(jī)制一:try-catch-finally
說明:
1. finally是可選的。
2. 使用try將可能出現(xiàn)異常代碼包裝起來矩乐,在執(zhí)行過程中龄句,一旦出現(xiàn)異常回论,就會(huì)生成一個(gè)對(duì)應(yīng)異常類的對(duì)象,根據(jù)此對(duì)象的類型分歇,去catch中進(jìn)行匹配
3. 一旦try中的異常對(duì)象匹配到某一個(gè)catch時(shí)傀蓉,就進(jìn)入catch中進(jìn)行異常的處理。一旦處理完成职抡,就跳出當(dāng)前的try-catch結(jié)構(gòu)(在沒有寫finally的情況)葬燎。繼續(xù)執(zhí)行其后的代碼
4. catch中的異常類型如果沒有子父類關(guān)系,則誰(shuí)聲明在上缚甩,誰(shuí)聲明在下無(wú)所謂谱净。catch中的異常類型如果滿足子父類關(guān)系,則要求子類一定聲明在父類的上面擅威。否則岳遥,報(bào)錯(cuò)
5. 常用的異常對(duì)象處理的方式: ① String? getMessage()? ? ② printStackTrace()
6. 在try結(jié)構(gòu)中聲明的變量,再出了try結(jié)構(gòu)以后裕寨,就不能再被調(diào)用
7. try-catch-finally結(jié)構(gòu)可以嵌套*
體會(huì)1:使用try-catch-finally處理編譯時(shí)異常,是得程序在編譯時(shí)就不再報(bào)錯(cuò)派继,但是運(yùn)行時(shí)仍可能報(bào)錯(cuò)宾袜。相當(dāng)于我們使用try-catch-finally將一個(gè)編譯時(shí)可能出現(xiàn)的異常,延遲到運(yùn)行時(shí)出現(xiàn)驾窟。
體會(huì)2:開發(fā)中庆猫,由于運(yùn)行時(shí)異常比較常見,所以我們通常就不針對(duì)運(yùn)行時(shí)異常編寫try-catch-finally了绅络。針對(duì)于編譯時(shí)異常月培,我們說一定要考慮異常的處理。
finally的使用:
1.finally是可選的
2.finally中聲明的是一定會(huì)被執(zhí)行的代碼恩急。即使catch中又出現(xiàn)異常了杉畜,try中有return語(yǔ)句,catch中有return語(yǔ)句等情況衷恭。
最后輸出:我一定會(huì)被執(zhí)行的 和 3此叠;
3.像數(shù)據(jù)庫(kù)連接、輸入輸出流随珠、網(wǎng)絡(luò)編程Socket等資源灭袁,JVM是不能自動(dòng)的回收的,我們需要自己手動(dòng)的進(jìn)行資源的釋放窗看。此時(shí)的資源釋放茸歧,就需要聲明在finally中。
舉例
異常處理機(jī)制二:throw?+ 異常類型
????????1. "throws + 異常類型"寫在方法的聲明處显沈。指明此方法執(zhí)行時(shí)软瞎,可能會(huì)拋出的異常類型。一旦當(dāng)方法體執(zhí)行時(shí),出現(xiàn)異常铜涉,仍會(huì)在異常代碼處生成一個(gè)異常類的對(duì)象智玻,此對(duì)象滿足throws后異常類型時(shí),就會(huì)被拋出芙代。異常代碼后續(xù)的代碼吊奢,就不再執(zhí)行!
? ? ????2. 體會(huì):try-catch-finally:真正的將異常給處理掉了纹烹。throws的方式只是將異常拋給了方法的調(diào)用者页滚。? 并沒有真正將異常處理掉。?
? ? ????3. 開發(fā)中如何選擇使用try-catch-finally 還是使用throws铺呵?
? ? ? ? ? ? ? ? 3.1 如果父類中被重寫的方法沒有throws方式處理異常裹驰,則子類重寫的方法也不能使用throws,意味著如果子類重寫的方法中有異常片挂,必須使用try-catch-finally方式處理幻林。
? ? ? ? ? ? ? ? 3.2 執(zhí)行的方法a中,先后又調(diào)用了另外的幾個(gè)方法音念,這幾個(gè)方法是遞進(jìn)關(guān)系執(zhí)行的沪饺。我們建議這幾個(gè)方法使用throws的方式進(jìn)行處理。而執(zhí)行的方法a可以考慮使用try-catch-finally方式進(jìn)行處理闷愤。
手動(dòng)拋出異常:throw
通過throw手動(dòng)拋出異常(注意區(qū)分throws)
自定義異常類
?如何自定義異常類整葡?
????1. 繼承于現(xiàn)有的異常結(jié)構(gòu):RuntimeException(不用顯示的處理) 、Exception(需要處理)
????2. 提供全局常量:serialVersionUID
????3. 提供重載的構(gòu)造器
注意 ??
1. 子類重寫的方法拋出的異常類型不大于父類被重寫的方法拋出的異常類型讥脐。
總結(jié)
例題
輸出結(jié)果:
面試題
1. final遭居、finally、finalize三者的區(qū)別
2. throw 和 throws 的區(qū)別
throw:表示拋出一個(gè)異常類的對(duì)象旬渠,生成異常對(duì)象的過程俱萍,聲明在方法體內(nèi)。
throws:屬于異常處理的一種方式告丢,聲明在方法的生命處鼠次。
另外相似結(jié)構(gòu):Collection 和 Collections,String 和 StringBuffer 還有 StringBuilder芋齿,Arraylist 和 LinkedList腥寇,HashMap 和 LinkedHashMap,重寫和重載
不相似結(jié)構(gòu):抽象類和借口觅捆,== 和 equals()赦役,sleep() 和 wait(),