首頁(yè)技術(shù)文章正文

運(yùn)行時(shí)異常和編譯時(shí)異常的處理機(jī)制是什么?

更新時(shí)間:2022-09-16 來(lái)源:黑馬程序員 瀏覽量:

編譯時(shí)異常,是在編譯成class文件時(shí)必須要處理的異常,也稱之為受檢異常,運(yùn)行時(shí)異常,在編譯成class文件不需要處理,在運(yùn)行字節(jié)碼文件時(shí)可能出現(xiàn)的異常。簡(jiǎn)單來(lái)說(shuō):編譯時(shí)異常就是在編譯的時(shí)候出現(xiàn)的異常,運(yùn)行時(shí)異常就是在運(yùn)行時(shí)出現(xiàn)的異常。

異常體系

學(xué)習(xí)異常的目的就是避免異常的出現(xiàn),同時(shí)處理可能出現(xiàn)的異常,讓代碼更穩(wěn)健。

運(yùn)行時(shí)異常示例

數(shù)組索引越界異常: ArrayIndexOutOfBoundsException

空指針異常 : NullPointerException,直接輸出沒(méi)有問(wèn)題,但是調(diào)用空指針的變量的功能就會(huì)報(bào)錯(cuò)。

數(shù)學(xué)操作異常:ArithmeticException

類型轉(zhuǎn)換異常:ClassCastException

數(shù)字轉(zhuǎn)換異常: NumberFormatException

運(yùn)行時(shí)異常:一般是程序員業(yè)務(wù)沒(méi)有考慮好或者是編程邏輯不嚴(yán)謹(jǐn)引起的程序錯(cuò)誤,自己的水平有問(wèn)題!

繼承自RuntimeException的異?;蛘咂渥宇?,編譯階段不報(bào)錯(cuò),運(yùn)行可能報(bào)錯(cuò)。

編譯時(shí)異常

編譯時(shí)異常不是RuntimeException或者其子類的異常,編譯階就報(bào)錯(cuò),必須處理,否則代碼不通過(guò)。

編譯時(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的異?;蛘咂渥宇?。出現(xiàn)編譯報(bào)錯(cuò),必須處理,否則代碼不通過(guò)。但編譯時(shí)異常通常很少,可遇不可求。

編譯時(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ù)代碼沒(méi)有機(jī)會(huì)執(zhí)行了,因?yàn)槌绦蛞呀?jīng)死亡。

(public class ExceptionDemo {
     public static void main(String[] args) {
         System.out.printLn("程序開(kāi)始。。。。。。。。。。");
         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ò)的,所以必須處理,否則代碼根本無(wú)法通過(guò).

編譯時(shí)異常的處理形式有三種:出現(xiàn)異常直接拋出去給調(diào)用者,調(diào)用者也繼續(xù)拋出去。 出現(xiàn)異常自己捕獲處理,不麻煩別人。前兩者結(jié)合,出現(xiàn)異常直接拋出去給調(diào)用者,調(diào)用者捕獲處理。

異常處理方式1 —— throws

throws:用在方法上,可以將方法內(nèi)部出現(xiàn)的異常拋出去給本方法的調(diào)用者處理。

這種方式并不好,發(fā)生異常的方法自己不處理異常,如果異常最終拋出去給虛擬機(jī)將引起程序死亡。

拋出異常格式:

方法 throws 異常1 ,異常2 ,異常3 ..{
}

規(guī)范做法:

方法 throws Exception{
}

異常處理方式2 —— try…catch…

監(jiān)視捕獲異常,用在方法內(nèi)部,可以將方法內(nèi)部出現(xiàn)的異常直接捕獲處理。這種方式還可以,發(fā)生異常的方法自己獨(dú)立完成異常的處理,程序可以繼續(xù)往下執(zhí)行。

try{
    // 可能出現(xiàn)異常的代碼!
}catch (Exception e){
    e.printStackTrace(); // 直接打印異常棧信息
}

Exception可以捕獲處理一切異常類型!

異常處理方式3 —— 前兩者結(jié)合

方法直接將異通過(guò)throws拋出去給調(diào)用者,調(diào)用者收到異常后直接捕獲處理。

異常處理的總結(jié)

在開(kāi)發(fā)中按照規(guī)范來(lái)說(shuō)第三種方式是最好的:底層的異常拋出去給最外層,最外層集中捕獲處理。實(shí)際應(yīng)用中,只要代碼能夠編譯通過(guò),并且功能能完成,那么每一種異常處理方式似乎也都是可以的。

運(yùn)行時(shí)異常的處理形式

運(yùn)行時(shí)異常編譯階段不會(huì)出錯(cuò),是運(yùn)行時(shí)才可能出錯(cuò)的,所以編譯階段不處理也可以。

按照規(guī)范建議還是處理:建議在最外層調(diào)用處集中捕獲處理即可。

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!