- Offer來了:Java面試核心知識點(diǎn)精講(原理篇)
- 王磊
- 1433字
- 2020-04-03 12:50:09
2.2 異常分類及處理
我們在開發(fā)過程中難免會遇到各種各樣的異常,如何處理異常直接影響到程序或系統(tǒng)的穩(wěn)定性,有時在線上僅僅忘記處理一個空指針異常都有可能引起整個運(yùn)行中的應(yīng)用程序的崩潰,因此具備全面的異常處理處理知識和良好的異常處理習(xí)慣對于開發(fā)人員來說至關(guān)重要。
2.2.1 異常的概念
異常指在方法不能按照正常方式完成時,可以通過拋出異常的方式退出該方法,在異常中封裝了方法執(zhí)行過程中的錯誤信息及原因,調(diào)用方在獲取該異常后可根據(jù)業(yè)務(wù)的情況選擇處理該異常或者繼續(xù)拋出該異常。
在方法在執(zhí)行過程中出現(xiàn)異常時,Java異常處理機(jī)制會將代碼的執(zhí)行權(quán)交給異常處理器,異常處理器根據(jù)在系統(tǒng)中定義的異常處理規(guī)則執(zhí)行不同的異常處理邏輯(拋出異常或捕捉并處理異常)。
2.2.2 異常分類
在Java中,Throwable是所有錯誤或異常的父類,Throwable又可分為Error和Exception,常見的Error有AWTError、ThreadDeath, Exception又可分為RuntimeException和CheckedException,如圖2-6所示。

圖2-6
Error指Java程序運(yùn)行錯誤,如果程序在啟動時出現(xiàn)Error,則啟動失敗;如果程序在運(yùn)行過程中出現(xiàn)Error,則系統(tǒng)將退出進(jìn)程。出現(xiàn)Error通常是因為系統(tǒng)的內(nèi)部錯誤或資源耗盡,Error不能被在運(yùn)行過程中被動態(tài)處理。如果程序出現(xiàn)Error,則系統(tǒng)能做的工作也只能有記錄錯誤的成因和安全終止。
Exception指Java程序運(yùn)行異常,即運(yùn)行中的程序發(fā)生了人們不期望發(fā)生的事件,可以被Java異常處理機(jī)制處理。Exception也是程序開發(fā)中異常處理的核心,可分為RuntimeException(運(yùn)行時異常)和CheckedException(檢查異常),如圖2-7所示。

圖2-7
◎ RuntimeException:指在Java虛擬機(jī)正常運(yùn)行期間拋出的異常,RuntimeException可以被捕獲并處理,如果出現(xiàn)RuntimeException,那么一定是程序發(fā)生錯誤導(dǎo)致的。我們通常需要拋出該異常或者捕獲并處理該異常。常見的RuntimeException有NullPointerException、ClassCastException、ArrayIndexOutOf BundsException等。
◎ CheckedException:指在編譯階段Java編譯器會檢查CheckedException異常并強(qiáng)制程序捕獲和處理此類異常,即要求程序在可能出現(xiàn)異常的地方通過try catch語句塊捕獲并處理異常。常見的CheckedException有由于I/O錯誤導(dǎo)致的IOException、SQLException、ClassNotFoundException等。該類異常一般由于打開錯誤的文件、SQL語法錯誤、類不存在等引起。
2.2.3 異常處理方式:拋出異常、使用try catch捕獲并處理異常
異常處理方式有拋出異常和使用try catch語句塊捕獲并處理異常這兩種方式。
(1)拋出異常:遇到異常時不進(jìn)行具體處理,而是將異常拋給調(diào)用者,由調(diào)用者根據(jù)情況處理。有可能是直接捕獲并處理,也有可能是繼續(xù)向上層拋出異常。拋出異常有三種形式:throws、throw、系統(tǒng)自動拋出異常。其中,throws作用在方法上,用于定義方法可能拋出的異常;throw作用在方法內(nèi),表示明確拋出一個異常。具體的使用方法如下:
public static void main(String[] args) { String str = "hello offer"; int index = 10; if (index >= str.length()) { //1:使用throw在方法內(nèi)拋出異常 throw new StringIndexOutOfBoundsException(); }else { str.substring(0, index); } } //2:使用throws在方法上拋出異常 int div(int a, int b) throws Exception{return a/b; }
以上代碼首先驗證字符串的長度,如果長度不夠,則通過throw關(guān)鍵字在方法內(nèi)拋出一個StringIndexOutOfBoundsException異常,同時定義了一個div方法,使用throws關(guān)鍵字在該方法上定義一個異常。
(2)使用try catch捕獲并處理異常:使用try catch捕獲異常能夠有針對性地處理每種可能出現(xiàn)的異常,并在捕獲到異常后根據(jù)不同的情況做不同的處理。其使用過程比較簡單:用try catch語句塊將可能出現(xiàn)異常的代碼包起來即可。具體的使用方法如下:
try { //具體的業(yè)務(wù)邏輯實(shí)現(xiàn) }catch (Exception e){ //捕獲異常并處理 }
throw和throws的區(qū)別如下。
◎ 位置不同:throws作用在方法上,后面跟著的是異常的類;而throw作用在方法內(nèi),后面跟著的是異常的對象。
◎ 功能不同:throws用來聲明方法在運(yùn)行過程中可能出現(xiàn)的異常,以便調(diào)用者根據(jù)不同的異常類型預(yù)先定義不同的處理方式;throw用來拋出封裝了異常信息的對象,程序在執(zhí)行到throw時后續(xù)的代碼將不再執(zhí)行,而是跳轉(zhuǎn)到調(diào)用者,并將異常信息拋給調(diào)用者。也就是說,throw后面的語句塊將無法被執(zhí)行(finally語句塊除外)。
- C語言程序設(shè)計教程
- PaaS程序設(shè)計
- JavaScript Unlocked
- Network Automation Cookbook
- C/C++常用算法手冊(第3版)
- QTP自動化測試進(jìn)階
- Visual C++數(shù)字圖像處理技術(shù)詳解
- Visual FoxPro程序設(shè)計
- Learning OpenStack Networking(Neutron)(Second Edition)
- Java網(wǎng)絡(luò)編程實(shí)戰(zhàn)
- Scala for Machine Learning(Second Edition)
- Hands-On Kubernetes on Windows
- Principles of Strategic Data Science
- UML軟件建模
- 游戲設(shè)計的底層邏輯