更新時間: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的異常或者其子類,編譯階段不報錯,運行可能報錯。
編譯時異常不是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ù)據。
④直接從當前執(zhí)行的異常點干掉當前程序。
⑤后續(xù)代碼沒有機會執(zhí)行了,因為程序已經死亡。
(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)異常直接拋出去給調用者,調用者捕獲處理。
throws:用在方法上,可以將方法內部出現(xiàn)的異常拋出去給本方法的調用者處理。
這種方式并不好,發(fā)生異常的方法自己不處理異常,如果異常最終拋出去給虛擬機將引起程序死亡。
拋出異常格式:
方法 throws 異常1 ,異常2 ,異常3 ..{ }
規(guī)范做法:
方法 throws Exception{ }
監(jiān)視捕獲異常,用在方法內部,可以將方法內部出現(xiàn)的異常直接捕獲處理。這種方式還可以,發(fā)生異常的方法自己獨立完成異常的處理,程序可以繼續(xù)往下執(zhí)行。
try{ // 可能出現(xiàn)異常的代碼! }catch (Exception e){ e.printStackTrace(); // 直接打印異常棧信息 } Exception可以捕獲處理一切異常類型!
方法直接將異通過throws拋出去給調用者,調用者收到異常后直接捕獲處理。
在開發(fā)中按照規(guī)范來說第三種方式是最好的:底層的異常拋出去給最外層,最外層集中捕獲處理。實際應用中,只要代碼能夠編譯通過,并且功能能完成,那么每一種異常處理方式似乎也都是可以的。
運行時異常的處理形式
運行時異常編譯階段不會出錯,是運行時才可能出錯的,所以編譯階段不處理也可以。
按照規(guī)范建議還是處理:建議在最外層調用處集中捕獲處理即可。