更新時(shí)間:2022-09-16 來源:黑馬程序員 瀏覽量:
編譯時(shí)異常,是在編譯成class文件時(shí)必須要處理的異常,也稱之為受檢異常,運(yùn)行時(shí)異常,在編譯成class文件不需要處理,在運(yùn)行字節(jié)碼文件時(shí)可能出現(xiàn)的異常。簡(jiǎn)單來說:編譯時(shí)異常就是在編譯的時(shí)候出現(xiàn)的異常,運(yùn)行時(shí)異常就是在運(yùn)行時(shí)出現(xiàn)的異常。
學(xué)習(xí)異常的目的就是避免異常的出現(xiàn),同時(shí)處理可能出現(xiàn)的異常,讓代碼更穩(wěn)健。
數(shù)組索引越界異常: ArrayIndexOutOfBoundsException
空指針異常 : NullPointerException,直接輸出沒有問題,但是調(diào)用空指針的變量的功能就會(huì)報(bào)錯(cuò)。
數(shù)學(xué)操作異常:ArithmeticException
類型轉(zhuǎn)換異常:ClassCastException
數(shù)字轉(zhuǎn)換異常: NumberFormatException
運(yùn)行時(shí)異常:一般是程序員業(yè)務(wù)沒有考慮好或者是編程邏輯不嚴(yán)謹(jǐn)引起的程序錯(cuò)誤,自己的水平有問題!
繼承自RuntimeException的異?;蛘咂渥宇?,編譯階段不報(bào)錯(cuò),運(yùn)行可能報(bào)錯(cuò)。
編譯時(shí)異常不是RuntimeException或者其子類的異常,編譯階就報(bào)錯(cuò),必須處理,否則代碼不通過。
編譯時(shí)異常示例
String date = "2015-01-12 10:23:21"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy=MM=dd HH:mm:ss"); Date d = sdf parce(date); System. out. println (d);
編譯時(shí)異常的目的是提醒程序員的不要出錯(cuò),在編譯階段發(fā)出的預(yù)警,編譯時(shí)異常繼承自Exception的異?;蛘咂渥宇悺3霈F(xiàn)編譯報(bào)錯(cuò),必須處理,否則代碼不通過。但編譯時(shí)異常通常很少,可遇不可求。
異常的默認(rèn)處理流程:
①默認(rèn)會(huì)在出現(xiàn)異常的代碼那里自動(dòng)的創(chuàng)建一個(gè)異常對(duì)象:ArithmeticException。
②異常會(huì)從方法中出現(xiàn)的點(diǎn)這里拋出給調(diào)用者,調(diào)用者最終拋出給JVM虛擬機(jī)。
③虛擬機(jī)接收到異常對(duì)象后,先在控制臺(tái)直接輸出異常棧信息數(shù)據(jù)。
④直接從當(dāng)前執(zhí)行的異常點(diǎn)干掉當(dāng)前程序。
⑤后續(xù)代碼沒有機(jī)會(huì)執(zhí)行了,因?yàn)槌绦蛞呀?jīng)死亡。
(public class ExceptionDemo { public static void main(String[] args) { System.out.printLn("程序開始。。。。。。。。。。"); chu( a: 10, b: 0); System.out.println("程序結(jié)求。。。。。。。。。。"); } public static void chu(int a , int b){ System.out.println(a); System.out.println(b); int c = a / b;//出現(xiàn)了運(yùn)行異常,自動(dòng)創(chuàng)建異常對(duì)象:ArithmeticException System.out.println("結(jié)果是:"+c); } }
編譯時(shí)異常是編譯階段就出錯(cuò)的,所以必須處理,否則代碼根本無法通過.
編譯時(shí)異常的處理形式有三種:出現(xiàn)異常直接拋出去給調(diào)用者,調(diào)用者也繼續(xù)拋出去。 出現(xiàn)異常自己捕獲處理,不麻煩別人。前兩者結(jié)合,出現(xiàn)異常直接拋出去給調(diào)用者,調(diào)用者捕獲處理。
throws:用在方法上,可以將方法內(nèi)部出現(xiàn)的異常拋出去給本方法的調(diào)用者處理。
這種方式并不好,發(fā)生異常的方法自己不處理異常,如果異常最終拋出去給虛擬機(jī)將引起程序死亡。
拋出異常格式:
方法 throws 異常1 ,異常2 ,異常3 ..{ }
規(guī)范做法:
方法 throws Exception{ }
監(jiān)視捕獲異常,用在方法內(nèi)部,可以將方法內(nèi)部出現(xiàn)的異常直接捕獲處理。這種方式還可以,發(fā)生異常的方法自己獨(dú)立完成異常的處理,程序可以繼續(xù)往下執(zhí)行。
try{ // 可能出現(xiàn)異常的代碼! }catch (Exception e){ e.printStackTrace(); // 直接打印異常棧信息 } Exception可以捕獲處理一切異常類型!
方法直接將異通過throws拋出去給調(diào)用者,調(diào)用者收到異常后直接捕獲處理。
在開發(fā)中按照規(guī)范來說第三種方式是最好的:底層的異常拋出去給最外層,最外層集中捕獲處理。實(shí)際應(yīng)用中,只要代碼能夠編譯通過,并且功能能完成,那么每一種異常處理方式似乎也都是可以的。
運(yùn)行時(shí)異常的處理形式
運(yùn)行時(shí)異常編譯階段不會(huì)出錯(cuò),是運(yùn)行時(shí)才可能出錯(cuò)的,所以編譯階段不處理也可以。
按照規(guī)范建議還是處理:建議在最外層調(diào)用處集中捕獲處理即可。