1、了解Java中的例外體系框架
介紹
例外就是程式運行程序中出現的錯誤,Java中,阻止當前方法或作用域的情況,稱之為例外
Java語言的例外處理框架,是Java語言健壯性的一個重要體現
思想
Java把例外當做物件來處理,并定義一個基類Java.lang.Throwable作為所有例外的超類,在Java API中已經定義了許多例外類,這些例外類分為兩大子類:
1)、錯誤:Error
包括虛擬機錯誤和執行緒死鎖,一旦Error出現,執行緒就徹底的掛了,被稱為程式終結者
這種情況僅憑程式是無法處理的,在程式中也不會對Error例外進行捕捉和拋出
2)、例外:Exception
主要指編碼、環境、用戶操作輸入出現問題,Exception主要包括兩大類:
-
- RuntimeException:運行時例外,也叫非檢查例外(NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArithmeticException),會由Java虛擬機自動拋出并自動捕獲,此類例外的出現絕大數情況是代碼本身有問題,應該從邏輯上去解決并改進代碼
- 檢查例外(其他的一些例外):引起該例外的原因多種多樣,比如說檔案不存在或者是連接錯誤,該例外必須手動在代碼里添加捕獲陳述句來處理該例外,從程式語法角度講是必須警醒處理的例外,如果不處理,程式就不能編譯通過,
2、Java例外的捕獲和處理try、catch、finally關鍵字
思想:Java通過面向物件的思想進行例外處理,把各種不同的例外進行分類,并提供了良好的介面,在Java中每個例外都是一個物件,它是Throwable類或其子類的實體,當一個方法出現例外后邊拋出一個例外物件,該物件中包含有例外資訊,呼叫這個物件方法可以捕獲到這個例外并可以對其進行處理
關鍵字:Java的例外處理是通過5個關鍵字來實作的:try、catch、finally、throw、throws,
-
- try
try陳述句不可以獨立存在,必須與catch或者finally塊同存,負責捕獲例外,一旦try中發現例外,程式的控制權將被移交給catch塊中例外處理程式
-
- catch
負責如何處理,比如發出警告:提示、檢查配置、網路連接、記錄錯誤等,執行完catch塊之后程式跳出catch塊,繼續執行后面的代碼,
撰寫catch塊的注意事項:多個catch塊處理的例外類,要按照先catch子類后catch父類的處理方式,因為會就近處理例外
-
- finally
最終執行的代碼,用于關閉和釋放資源
try{ //一些會拋出的例外代碼 }catch(){ //處理該例外的代碼塊 }catch(){ //處理該例外的代碼塊 }finally{ //最終要執行的代碼 }
3、Java例外的捕獲和處理之三種例外處理模型
Java的例外梳理模型給予三種操作:
-
- 宣告例外
throws-----宣告將要拋出何種型別的例外,當某個方法可能拋出某種例外時用于throws宣告可能拋出的例外,然后交給上層呼叫它的方法程式處理
-
- 拋出例外
throw------將產生的例外拋出,是拋出例外的一個動作,一般會用于程式出現某種邏輯時程式會主動拋出某種特定的型別的例外
-
- 捕獲例外
當拋出一個例外時,可以在try-catch塊中捕獲它并進行處理
1、若執行try塊的程序中沒有例外發生,則跳過catch子句,
2、若是出現例外,try塊中剩余的陳述句不在執行
3、開始逐步檢查catch塊,判斷catch塊的例外類實體是否是捕獲的例外型別
4、匹配后執行相應的catch塊中的代碼
5、如果例外沒有在當前的方法中被捕獲,就會被傳遞給該方法的呼叫者,這個程序一直重復,知道例外被捕獲或傳給main方法(交給jvm來捕獲)
4、Java例外體系中throw和throws的比較
-
- throws出現在方法函式頭;而throw出現在函式體,
- throws表示出現例外的一種可能性,并不一定會發生這些例外;throw則是拋出了例外,執行throw則一定拋出了某種例外物件,
- 兩者都是消極處理例外的方式,只是拋出或者可能拋出例外,但是不會由函式去處理例外,真正的處理例外由函式的上層呼叫處理,
5、Java例外體系中catch捕獲例外的順序
-
- 一個通用父類可以派生出各種例外類,如果一個catch塊可以捕獲一個父類的例外物件,它就能捕獲哪個父類的所有子類的例外物件
- 如果捕獲的是多個同型別例外,則子類例外在前,父類例外災后,不然會導致編譯錯誤
這是因為父類例外囊括了子類例外,如果福爾利例外在前,子類例外永遠捕獲不到,導致優勢或無法準確描述錯誤資訊
6、Java例外體系中try-catch-finally的執行流程
執行流程
-
- try塊中引起例外,例外代碼之后的陳述句不再執行
- 若被catch塊捕獲,執行匹配的catch塊,然后執行finally陳述句
- 若catch塊不能捕獲例外,則執行finally陳述句,之后將例外傳遞給這個方法的呼叫者
- finally在try中的return陳述句執行后,return回傳主調函式指點執行
return回傳值各種情況
-
- try,catch,finally陳述句塊中均有return,三個陳述句塊中都沒有拋出例外:將執行finally陳述句塊中的return,
- try,catch,陳述句塊中均有return,finally陳述句塊中無return,try中拋出例外切catch捕捉到例外:將執行catch陳述句塊的return
- try,catch,陳述句塊中均有return,finally陳述句塊中無return,三個陳述句塊中竇娥米有拋出例外:將執行try陳述句的return
- try,catch,finally陳述句塊中均有return,try陳述句塊中拋出例外切catch捕捉到例外:將執行finally陳述句塊的return
- try,catch,陳述句塊中均有return,finally陳述句塊中無return,try陳述句塊中拋出例外且catch捕捉到例外,catch陳述句塊有拋出例外:將拋出catch陳述句塊中的拋出的例外
- try,catch,finally陳述句塊中均有return,try陳述句塊中拋出例外且catch捕捉到例外,catch陳述句塊有拋出例外:將執行finally陳述句塊中的return
- try,catch,陳述句塊中均有return,finally陳述句塊中無return,try陳述句塊中拋出例外與catch要捕獲的例外型別不一致:將拋出try陳述句塊的例外
- try,catch,finally陳述句塊中均有return,try陳述句塊中拋出例外與catch要捕獲的例外型別不一致:將執行finally陳述句塊中的return
- try,catch,finally陳述句塊中均有return,try和catch陳述句塊沒有拋出例外,finally陳述句塊中拋出例外:將拋出finally陳述句塊中例外
7、Java例外體系中try-finally的使用把場景
流程
-
- try塊中引起例外,例外代碼之后的陳述句不再執行,直接執行finally陳述句
- try塊沒有引發例外,則執行完try塊就執行finally陳述句
使用場景
-
- try-finally可用于不需要捕獲例外的代碼,可以保證資源在使用后被關閉
如:IO六中執行完相應操作后,關閉相應資源;使用Lock物件保證執行緒同步,通過finally可以保證鎖會被釋放;資料庫連接代碼時,關閉連接操作等等
8、Java例外體系中finally什么時候不會被執行
-
- 在前面的代碼中用了system.exit(0)退出程式
- finally陳述句中發生了例外
- 程式所在的執行緒死亡
- 關閉CPU
- 在 Java 虛擬機退出時, Daemon 執行緒中finally不一定會執行
9、Java例外體系值自定義例外
為什么要使用自定義例外,有什么好處?
-
- 我們在作業的時候,專案是分模塊或者分功能開發的,基本不會你一個人開發一整個專案,使用自定義例外類就統一了對外例外展示的方式
- 有時候我們遇到某些校驗或者問題時,需要直接結束掉當前的請求,這時就可以通過拋出自定義例外來結束
- 自定義例外可以在我們專案中某些特殊的業務邏輯時拋出例外,比如"中性".equals(sex),性別等于中性時我們喲啊拋出例外,而Java是不會由這種例外的,
- 使用自定義例外繼承相關的例外來拋出處理后的例外資訊可以隱藏底層的例外,這樣更安全,例外資訊也更加的直觀,
缺點
-
- 毋庸置疑,我們不可能期待JVM自動拋出一個自定義例外,也不能期待JVM 會自動處理一個自定義例外
- 發現例外、拋出例外以及處理例外的作業必須考變成人員在代碼中利用例外處理機制自己完成,這樣就相應的增加了開發成本和作業量,所以專案沒有必要的話,也不一定非喲啊用上自定義例外,要能夠自己去權衡
使用
-
- 所有例外都必須是Throwable的子類
- 如果希望寫一個檢查性例外類
- 如果你想寫一個運行時例外類,那么需要繼承RuntimeExection類
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/124073.html
標籤:Java
