看個圖
異常分類
運行時異常
- 定義:是指編譯器不要求強制處置的異常。一般是指編程時的邏輯錯誤痰腮,是程序員應(yīng)該積極避免出現(xiàn)的異常。
java.lang.RuntimeException
類及它的子類都是運行時異常明棍。對于這類異常攒菠,可以不作處理,因為這類異常很普遍茎活,若全處理可能會對程序的可讀性和運行效率產(chǎn)生影響
編譯時異常
- 定義:是指編譯器要求必須處置的異常昙沦。即程序在運行時由于外界因素造成的一般性異常。編譯器要求Java程序必須捕獲或聲明所有編譯時異常载荔。對于這類異常盾饮,如果程序不處理,可能會帶來意想不到的結(jié)果。
異常處理機制
try-catch-finally語句
- 用法
try{
...... //可能產(chǎn)生異常的代碼
}
catch( ExceptionName1 e ){
...... //當(dāng)產(chǎn)生ExceptionName1型異常時的處置措施
}
catch( ExceptionName2 e ){
...... //當(dāng)產(chǎn)生ExceptionName2型異常時的處置措施
}
finally{
...... //無論是否發(fā)生異常丘损, 都無條件執(zhí)行的語句
}
說明:如果明確知道產(chǎn)生的是何種異常普办,可以用該異常類作為
catch
的參數(shù);也可 以用其父類作為catch
的參數(shù)徘钥。比如可 以 用ArithmeticException
類 作 為 參 數(shù) 的 地 方 衔蹲, 就 可 以 用RuntimeException
類作為參數(shù),或者用所有異常的父類Exception
類作為參數(shù)呈础。但不能是與ArithmeticException
類無關(guān)的異常舆驶,如NullPointerException
(catch 中的語句將不會執(zhí)行)-
捕獲異常的有關(guān)信息:與其它對象一樣,可以訪問一個異常對象的成員變量或調(diào)用它的 方法
getMessage()
獲取異常信息而钞,返回字符串printStackTrace()
獲取異常類名和異常信息贞远,以及異常出現(xiàn)在程序中的位置。返回值void示意圖:
finally : 捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口笨忌,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理.不論在try代碼塊中是否發(fā)生了異常事件俱病,catch語句是否執(zhí)行官疲,catch語句是否有異常,catch語句中是否有return亮隙,finally塊中的語句都會被執(zhí)行
finally語句和catch語句是任選的
如圖:
前面使用的異常都是
RuntimeException
類或是它的子類途凫,這些類的異常的特 點是:即使沒有使用try和catch捕獲,Java自己也能捕獲溢吻,并且編譯通過 ( 但運行時會發(fā)生異常使得程序運行終止 )如果拋出的異常是
IOException
等類型的非運行時異常维费,則必須捕獲,否則 編譯錯誤促王。也就是說犀盟,我們必須處理編譯時異常,將異常進行捕捉蝇狼,轉(zhuǎn)化為 運行時異常
處理異常的第二種方式---聲明拋出異常 throws
含義:如果一個方法(中的語句執(zhí)行時)可能生成某種異常阅畴,但是并不能確定如何處理這 種異常,則此方法應(yīng)顯示地聲明拋出異常迅耘,表明該方法將不對這些異常進行處理贱枣, 而由該方法的調(diào)用者負責(zé)處理
用法:在方法聲明中用
throws
語句可以聲明拋出異常的列表,throws后面的異常類型可 以是方法中產(chǎn)生的異常類型颤专,也可以是它的父類-
如圖:
- 重寫方法不能拋出比被重寫方法范圍更大的異常類型
手動拋出異常
含義:Java異常類對象除在程序執(zhí)行過程中出現(xiàn)異常時由系統(tǒng)自動生成并拋出纽哥,也可根據(jù)需要 使用人工 創(chuàng)建并拋出
-
用法:
- 首先要生成異常類對象,然后通過throw語句實現(xiàn)拋出操作(提交給Java運 行環(huán)境
IOException e = new IOException();
throw e;
- 可以拋出的異常必須是Throwable或其子類的實例栖秕。下面的語句在編譯時將 會產(chǎn)生語法錯誤
throw new String("want to throw");
自定義異常類
用法: 選擇一個合適的父類春塌,提供一個 serialVersionUID
如圖: