首頁技術文章正文

運行時異常和編譯時異常的處理機制是什么?

更新時間:2022-09-16 來源:黑馬程序員 瀏覽量:

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

異常體系

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

運行時異常示例

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

空指針異常 : NullPointerException,直接輸出沒有問題,但是調用空指針的變量的功能就會報錯。

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

類型轉換異常:ClassCastException

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

運行時異常:一般是程序員業(yè)務沒有考慮好或者是編程邏輯不嚴謹引起的程序錯誤,自己的水平有問題!

繼承自RuntimeException的異?;蛘咂渥宇悾幾g階段不報錯,運行可能報錯。

編譯時異常

編譯時異常不是RuntimeException或者其子類的異常,編譯階就報錯,必須處理,否則代碼不通過。

編譯時異常示例

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);

編譯時異常的目的是提醒程序員的不要出錯,在編譯階段發(fā)出的預警,編譯時異常繼承自Exception的異?;蛘咂渥宇?。出現(xiàn)編譯報錯,必須處理,否則代碼不通過。但編譯時異常通常很少,可遇不可求。

編譯時異常

異常的默認處理流程:

①默認會在出現(xiàn)異常的代碼那里自動的創(chuàng)建一個異常對象:ArithmeticException。

②異常會從方法中出現(xiàn)的點這里拋出給調用者,調用者最終拋出給JVM虛擬機。

③虛擬機接收到異常對象后,先在控制臺直接輸出異常棧信息數(shù)據(jù)。

④直接從當前執(zhí)行的異常點干掉當前程序。

⑤后續(xù)代碼沒有機會執(zhí)行了,因為程序已經(jīng)死亡。

(public class ExceptionDemo {
     public static void main(String[] args) {
         System.out.printLn("程序開始。。。。。。。。。。");
         chu( a: 10, b: 0);
         System.out.println("程序結求。。。。。。。。。。");
     }

     public static void chu(int a , int b){
          System.out.println(a);
          System.out.println(b);
          int c = a / b;//出現(xiàn)了運行異常,自動創(chuàng)建異常對象:ArithmeticException
          System.out.println("結果是:"+c);
     }
}

編譯時異常是編譯階段就出錯的,所以必須處理,否則代碼根本無法通過.

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

異常處理方式1 —— throws

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

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

拋出異常格式:

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

規(guī)范做法:

方法 throws Exception{
}

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

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

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

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

異常處理方式3 —— 前兩者結合

方法直接將異通過throws拋出去給調用者,調用者收到異常后直接捕獲處理。

異常處理的總結

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

運行時異常的處理形式

運行時異常編譯階段不會出錯,是運行時才可能出錯的,所以編譯階段不處理也可以。

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

分享到:
在線咨詢 我要報名
和我們在線交談!