Java中的異常處理機制介紹(非常全面!)
異常處理機制
異常的默認處理流程如下:
默認會在出現(xiàn)異常的代碼那里自動的創(chuàng)建一個異常對象:ArithmeticException。
異常會從方法中出現(xiàn)的點這里拋出給調用者,調用者最終拋出給JVM虛擬機。
虛擬機接收到異常對象后,先在控制臺直接輸出異常棧信息數(shù)據(jù)。
直接從當前執(zhí)行的異常點干掉當前程序。
后續(xù)代碼沒有機會執(zhí)行了,因為程序已經死亡。
但是默認的異常處理機制并不好,一旦真的出現(xiàn)異常,程序立即死亡!
編譯時異常處理機制
編譯時異常是編譯階段就出錯的,所以必須處理,否則代碼根本無法通過
編譯時異常處理有三種形式:
出現(xiàn)異常直接拋出去給調用者,調用者也繼續(xù)拋出去。
出現(xiàn)異常自己捕獲處理,不麻煩別人。
前兩者結合,出現(xiàn)異常直接拋出去給調用者,調用者捕獲處理。
異常處理方式一
throws:用在方法上,可以將方法內部出現(xiàn)的異常拋出去給本方法的調用者處理。
這種方式并不好,發(fā)生異常的方法自己不處理異常,如果異常最終拋出去給虛擬機將引起程序死亡。
拋出異常的格式:
方法 throws 異常1 ,異常2 ,異常3 ..{
}
規(guī)范做法: 代表可以拋出一切異常
方法 throws Exception{
}
public static void main(String[] args) throws Exception {
String date = "2022-10-25 22:32:31";
// 創(chuàng)建一個日期格式化類
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 解析字符串為時間對象
Date newDate = sdf.parse(date);
System.out.println(newDate);
}
異常處理方式二
try…catch…: 監(jiān)視捕獲異常,用在方法內部,可以將方法內部出現(xiàn)的異常直接捕獲處理。
這種方式還可以,發(fā)生異常的方法自己獨立完成異常的處理,程序可以繼續(xù)往下執(zhí)行。
一般格式:
try{
// 監(jiān)視可能出現(xiàn)異常的代碼!
}catch(異常類型1 變量){
// 處理異常
}catch(異常類型2 變量){
// 處理異常
}...
public static void main(String[] args) {
System.out.println("程序開始");
parseTime("2022-10-25 22:32:31");
System.out.println("程序結束");
}
public static void parseTime(String date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");
Date newDate = sdf.parse(date);
System.out.println(newDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
推薦格式: Exception可以捕獲處理一切異常類型, 通過Exception使用一個catch塊!
try{
// 可能出現(xiàn)異常的代碼!
}catch (Exception e){
e.printStackTrace(); // 直接打印異常棧信息
}
異常處理方式三
前兩者結合: 方法直接將異通過throws拋出去給調用者, 讓調用者收到異常后直接捕獲處理, 而不是方法內部自己處理。
public static void main(String[] args) {
System.out.println("程序開始");
// 方法調用者捕獲和處理異常
try {
parseTime("2022-10-25 22:32:31");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("程序結束");
}
// 方法中直接拋出異常給方法調用者
public static void parseTime(String date) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");
Date newDate = sdf.parse(date);
System.out.println(newDate);
}
異常處理方案總結:
在開發(fā)中按照規(guī)范來說第三種方式是最好的:底層的異常拋出去給最外層,最外層集中捕獲處理。
實際應用中,只要代碼能夠編譯通過,并且功能能完成,那么每一種異常處理方式似乎也都是可以的
運行時異常處理機制
運行時異常編譯階段不會出錯,是運行時才可能出錯的,所以編譯階段不處理也可以。
按照規(guī)范建議還是處理:建議在最外層調用處集中捕獲處理即可。
例如下面代碼, 編譯階段不處理也不會報錯
public static void main(String[] args) {
System.out.println("程序開始");
chu(20, 0);
System.out.println("程序結束");
}
public static void chu(int a, int b) {
System.out.println(a);
System.out.println(b);
int c = a / b;
System.out.println(c);
}
但是按照規(guī)范, 建議還是處理: 運行時異常默認會拋出, 我們只需在方法調用處捕獲處理異常
public static void main(String[] args) {
System.out.println("程序開始");
try {
chu(20, 0);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("程序結束");
}
public static void chu(int a, int b) {
System.out.println(a);
System.out.println(b);
int c = a / b;
System.out.println(c);
}
總結
到此這篇關于Java中異常處理機制的文章就介紹到這了,更多相關Java異常處理機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Hibernate中l(wèi)oad方法與get方法的區(qū)別
Hibernate中有兩個極為相似的方法get()與load(),他們都可以通過指定的實體類與ID從數(shù)據(jù)庫中讀取數(shù)據(jù),并返回對應的實例,但Hibernate不會搞兩個完全一樣的方法的2016-01-01

