Java中的異常Exception詳細解析
一、基本介紹
基本概念
Java語言中,將程序執(zhí)行中發(fā)生的不正常情況稱為“ 異常 ”。(開發(fā)過程中的語法錯誤和邏輯錯誤不是異常)
執(zhí)行過程中所發(fā)生的異常事件可分為兩大類
1.Error(錯誤):Java虛擬機無法解決的嚴重問題。如:JVM系統(tǒng)內(nèi)部錯誤、資源耗盡等嚴重情況。比如:StackOverflowError[棧溢出]和OOM(out of memory),Error是嚴重錯誤,程序會崩潰
2.Exception:其它因編譯錯誤和偶然的外在因素導(dǎo)致的一般性問題,可以使用針對性的代碼進行處理。例如空指針訪問,試圖讀取不存在的文件,網(wǎng)絡(luò)連接中斷等等,Exception分為兩大類:運行時異常[程序運行時發(fā)生的異常]和編譯時異常[編程時編譯器檢查出的異常]
異常類層次結(jié)構(gòu)圖
異常體系圖小結(jié):
1.異常分為兩大類,運行時異常和編譯時異常
2.運行時異常,編譯器檢查不出來。一般是指編程時的邏輯錯誤,是程序員應(yīng)該避免其出現(xiàn)的異常。java.lang.RuntimeException類及它的子類都是運行時異常
3.對于運行時異??梢圆蛔鎏幚?,因為這類異常很普遍,若全處理可能會對程序的可讀性和運行效率產(chǎn)生影響
4.編譯時異常是編譯器要求必須處置的異常
常見的運行時異常
1. NullPointerException 空指針異常
當應(yīng)用程序試圖在需要對象的地方使用null時,會拋出此異常
2. ArithmeticException 數(shù)學(xué)運算異常
當出現(xiàn)異常的運算條件時,會拋出此異常
3. ArrayIndexOutOfBoundsException 數(shù)組下標越界異常
用非法索引訪問數(shù)組時拋出的異常。如果索引為負或大于等于數(shù)組大小,則該索引為非法索引
4. ClassCastException 類型轉(zhuǎn)換異常
當試圖將對象強制轉(zhuǎn)換為不是實例的子類時,會拋出此異常
5.NumberFormatException 數(shù)字格式不正確異常
當應(yīng)用程序試圖將字符串轉(zhuǎn)換成一種數(shù)值類型,但該字符串不能轉(zhuǎn)換為適當格式,會拋出此異常—>使用異常我們可以確保輸入是滿足條件數(shù)字
二、異常處理
基本介紹
異常處理就是當異常發(fā)生時,對異常處理的方式
異常處理的方式
1. try—catch—finally :程序員在代碼中捕獲發(fā)生的異常,自行處理
2. throws :將發(fā)生的異常拋出,交給調(diào)用者(方法)來處理,最頂級的處理者就是JVM
三、try-catch異常處理
1.Java提供try和catch塊來處理異常。try塊用于包含可能出錯的代碼。catch塊用于處理try塊中發(fā)生的異常??梢愿鶕?jù)需要在程序中有多個try...catch塊
2.基本語法
try{ //可疑代碼 //將異常生成對應(yīng)的異常對象,傳遞給catch塊 }catch{ //對異常的處理 } //如果沒有finally,語法也可以通過
3. try-catch方式處理異常注意事項
①如果異常發(fā)生了,則異常發(fā)生后面的代碼不會執(zhí)行,直接進入到catch塊
②如果異常沒有發(fā)生,則順序執(zhí)行try的代碼塊,不會進入到catch
③如果希望不管是否發(fā)生異常,都執(zhí)行某段代碼(比如關(guān)閉連接,釋放資源等)則使用代碼 -finally{ }
try{ //可疑代碼 }catch(異常){ //.... }finally{ //釋放資源等.. }
4.可以有多個catch語句捕獲不同的異常(進行不同的業(yè)務(wù)處理),要求子類異常寫在前面,父類異常寫在后面,比如(NullPointerException在前,Exception在后),如果發(fā)生異常,只會匹配一個catch
5.可以進行try-finally配合使用,這種用法相當于沒有捕獲異常,依次程序會直接崩掉/退出。應(yīng)用場景就是執(zhí)行一段代碼,不管是否發(fā)生異常,都必須執(zhí)行某個業(yè)務(wù)邏輯
try-catch-finally執(zhí)行順序小結(jié)
1.如果沒有出現(xiàn)異常,則執(zhí)行try塊中所有語句,不執(zhí)行catch塊中語句,如果有finally,最后還需要執(zhí)行finally里面的語句
2.如果出現(xiàn)異常,則try塊中異常發(fā)生后,try塊剩下的語句不會再執(zhí)行。將執(zhí)行catch塊中的語句,如果有finally,最后還需要執(zhí)行finally里的語句
public class TryCatchDetail { public static void main(String[] args) { //快捷鍵ctrl + alt + t //解讀 //1.如果發(fā)生異常,則異常后面的代碼塊不會執(zhí)行,直接進入到catch塊 //2.如果異常沒有發(fā)生,則順序執(zhí)行try的代碼塊,不會進入到catch //3.如果希望不管是否發(fā)生異常,都執(zhí)行某段代碼塊(比如關(guān)閉連接,釋放資源等)則使用代碼— finally try { String str = "123"; int a = Integer.parseInt(str); System.out.println("數(shù)字:" + a); } catch (NumberFormatException e) { System.out.println("異常信息=" + e.getMessage()); }finally{ System.out.println("finally代碼塊被執(zhí)行..."); } System.out.println("程序繼續(xù)執(zhí)行..."); } } public class TryCatchDetail02 { public static void main(String[] args) { //解讀 //1.如果try代碼塊可能有多個異常 //2.可以使用多個catch分別捕獲不同的異常,相應(yīng)處理 //3.要求子類異常寫在前面,父類異常寫在后面 try { Person person = new Person(); person = null; System.out.println(person.getName());//NullPointerException int n1 = 10; int n2 = 0; int res = n1 / n2;//ArithmeticException }catch (NullPointerException e) { System.out.println("空指針異常=" + e.getMessage()); }catch(ArithmeticException e) { System.out.println("算數(shù)異常=" + e.getMessage()); }catch (Exception e) { System.out.println("異常信息=" + e.getMessage()); }finally { } } } class Person { private String name; public String getName() { return name; } } public class TryCatchDetail03 { public static void main(String[] args) { /* 可以進行try-finally配合使用,這種用法相當于沒有捕獲異常,因此程序會直接崩掉/退出。 應(yīng)用場景就是執(zhí)行一段代碼,不管是否發(fā)生異常,都必須執(zhí)行某個業(yè)務(wù)邏輯 */ try{ int n1 = 10; int n2 = 0; System.out.println(n1 / n2); }finally { System.out.println("執(zhí)行了finally..."); } System.out.println("程序繼續(xù)執(zhí)行..."); } }
四、thorws異常處理
基本介紹
1.如果一個方法中的語句執(zhí)行時可能生成某種異常,但是并不能確定如何處理這種異常,則此方法應(yīng)顯示地聲明拋出異常,表明該方法將不對這些異常進行處理,而由該方法的調(diào)用者負責處理
2.在方法生命中用throws語句可以聲明拋出異常的列表,thros后面的異常類型可以是方法中產(chǎn)生的異常類型,也可以是它的父類
注意事項和使用細節(jié)
1.對于編譯異常,程序中必須處理,比如try-catch或者throws
2.對于運行時異常,程序中如果沒有處理,默認就是throws的方式處理
3.子類重寫父類的方法時,對拋出異常的規(guī)定:子類重寫的方法,所拋出的異常類型要么和父類拋出的異常一致,要么為父類拋出的異常的子類型
4.在throws過程中,如果有方法try-catch,就相當于處理異常,就可以不必throws
五、自定義異常
基本概念
當程序中出現(xiàn)了某些“錯誤”,但該錯誤信息并沒有在Throwable子類中描述處理,這個時候可以自己設(shè)計異常類,用于描述該錯誤信息
自定義異常的步驟
1.定義類:自定義異常類名繼承Exception或RuntimeException
2.如果繼承Exception,屬于編譯異常
3.如果繼承RuntimeException,屬于運行異常(一般來說,繼承RuntimeException)
六、throw和throws的區(qū)別
意義 | 位置 | 后面跟的東西 | |
throws | 異常處理的一種方式 | 方法聲明處 | 異常類型 |
throw | 手動生成異常對象的關(guān)鍵字 | 方法體中 | 異常對象 |
到此這篇關(guān)于Java中的異常Exception詳細解析的文章就介紹到這了,更多相關(guān)Java異常Exception內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java并發(fā)請求下數(shù)據(jù)插入重復(fù)問題的解決方法
現(xiàn)在遇到一個項目,移動設(shè)備存儲數(shù)據(jù),然后一起上傳,那就出現(xiàn)了許多重復(fù)數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java并發(fā)請求下數(shù)據(jù)插入重復(fù)問題的解決方法,需要的朋友可以參考下2021-11-11