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