校園網(wǎng)站建設(shè)的目的網(wǎng)站查詢是否安全
異常的體系結(jié)構(gòu)
在java的Throwable下有Error和Exception兩個(gè)子類(lèi)
- Error(錯(cuò)誤):程序運(yùn)行中出現(xiàn)了嚴(yán)重的問(wèn)題,非代碼性錯(cuò)誤,無(wú)法處理,常見(jiàn)的有虛擬機(jī)運(yùn)行錯(cuò)誤和內(nèi)存溢出等
- Exception(異常):是由于代碼本身造成的問(wèn)題,可以進(jìn)行處理,異常一個(gè)可以分為運(yùn)行時(shí)異常和編譯時(shí)異常
運(yùn)行時(shí)異常(unchecked exception):在Exception類(lèi)下RuntimeException類(lèi)以及其下面所有的子類(lèi)都是運(yùn)行時(shí)異常;運(yùn)行時(shí)異常只有在程序運(yùn)行時(shí)才能被發(fā)現(xiàn),編譯期間不能被發(fā)現(xiàn)
編譯時(shí)異常(checked exception):在Exception類(lèi)下除了RuntimeException類(lèi)及其子類(lèi)其他的異常都是編譯時(shí)異常;如果有編譯時(shí)異常(異常不被處理)程序不能通過(guò)編譯
異常的抓拋模型
抓拋模型分為抓和拋兩個(gè)過(guò)程
- 拋: 程序在正常執(zhí)行的過(guò)程中,一旦出現(xiàn)異常,就會(huì)在異常代碼處生成一個(gè)對(duì)應(yīng)有異常類(lèi)的對(duì)象,并將此對(duì)象拋出給程序的調(diào)用者,一旦拋出對(duì)象后其后的代碼就不再執(zhí)行
- 抓:異常的抓取也就是對(duì)異常的兩種處理方式( try-catch-finally方式和throws+異常類(lèi)型方式)
方式一:try-catch-finally
使用try將可能有問(wèn)題的代碼包裹起來(lái);發(fā)生異常后自動(dòng)生成一個(gè)對(duì)應(yīng)類(lèi)型的異常對(duì)象,此后會(huì)根據(jù)catch中的異常類(lèi)型匹配,匹配到對(duì)應(yīng)的catch后進(jìn)入catch中進(jìn)行異常處理,完成處理后跳出try-catch結(jié)構(gòu)(如果有finally執(zhí)行finally中代碼)繼續(xù)執(zhí)行后面的代碼
public void fileTest() throws IOException {try{//拿到文件字節(jié)流FileInputStream fis = new FileInputStream("E:/upload/test2.txt");InputStreamReader isr = new InputStreamReader(fis);...}catch(IOException e){//catch聲明的異常類(lèi)型如果沒(méi)有子父類(lèi)關(guān)系,聲明先后沒(méi)有關(guān)系,如果存在子父類(lèi)關(guān)系,則子類(lèi)聲明在父類(lèi)之前,否則報(bào)錯(cuò)....//處理異常//常用異常的處理方法://e.getMessage();//e.printStackTrace();}finally{fis.close();//關(guān)閉輸入流//像數(shù)據(jù)庫(kù)連接,輸入輸出流,socket等資源,JVM是不能自己回收的,需要自己手動(dòng)釋放,這些資源的釋放應(yīng)該放在finally中}}
注意:
方式二:throws+異常類(lèi)型
發(fā)生異常后還會(huì)生成一個(gè)異常對(duì)象;拋出異常對(duì)象后不再執(zhí)行后面的代碼,throws只是將異常拋給了方法的調(diào)用者,并不能真正的解決異常。
對(duì)父類(lèi)的方法重寫(xiě)拋出異常: 子類(lèi)拋出的異常不能大于父類(lèi)拋出的異常
子類(lèi)重寫(xiě)父類(lèi)的方法,父類(lèi)沒(méi)有異常,子類(lèi)也不能拋出異常,只能用try-catch立馬解決。
手動(dòng)拋出異常
throw new 異常類(lèi)();
自定義異常
1.繼承現(xiàn)有的異常結(jié)構(gòu):RuntimeException,Exception
2.提供全局變量:serialVersionUID
3.提供重載的構(gòu)造器
異常鏈
一個(gè)父類(lèi)的多個(gè)子類(lèi)可能會(huì)出現(xiàn)多種異常,當(dāng)需要將異常向上傳遞的時(shí)候,父類(lèi)可以拋出的異常一定要大于子類(lèi)的異常,在傳遞過(guò)程中會(huì)造成異常信息的丟失,從而給后面的維護(hù)工作造成麻煩??梢酝ㄟ^(guò)在子類(lèi)的catch中手動(dòng)的throw一個(gè)異常寫(xiě)明拋出異常的原因,然后將這個(gè)異常繼續(xù)向上拋出,從而形成一個(gè)異常鏈,保留最原本發(fā)生異常的信息。
public class Test {public void f1() throws MyException {try {FileReader reader = new ...} catch (FileNotFoundException e) {throw new MyException("文件沒(méi)有找到", e);}}public void f2() throws MyException {try {f1();} catch (MyException e) {throw new MyException("文件沒(méi)有找到", e);}}public static void main(String[] args) {Test t = new Test();try {t.f2();} catch (MyException e) {e.printStackTrace();}}