Java異常類型及處理
一、異常定義
異常就是“意外、例外”的意思,也就是非正常情況。異常本質(zhì)上是程序上的錯誤,包括程序邏輯錯誤和系統(tǒng)錯誤。異常的處理基本上就是用來兜底的,也是程序開發(fā)中程序不愿意看到的。異常最基本的信息就是線程的堆棧信息。
二、異常的結(jié)構(gòu)和分類
Throwable主要分為Error和Exception。
錯誤:Error類以及他的子類的實例,代表了JVM本身的錯誤。錯誤不能被程序員通過代碼處理,躺平解決就好,不要反抗。常見的錯誤有下面這些
異常:Exception以及他的子類,代表程序運(yùn)行時發(fā)送的各種不期望發(fā)生的事件。可以被Java異常處理機(jī)制使用,是異常處理的核心,能在程序中解決的都不叫事。常見的異常有這么多。
三、異常的處理和捕獲
異常想要處理肯定要先捕獲到異常才可以,怎么捕獲異常吶,Java給我提供了幾個關(guān)鍵字,每個關(guān)鍵字怎么用吶?
1、try,catch 就是直接捕獲異常,catch 內(nèi)的異常類型是能捕獲的類型,一般如果有多個異常,從上到下的順序是異常范圍越來越大。注:ErrorCodeException的定義可以參考自定義異常。
public static void second(String[] args) { try { throw new ErrorCodeException("1123"); } catch (ErrorCodeException e) { e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } }
2、try catch finally 增加了finally關(guān)鍵字,就是在異常之后還能做一些事情,比如常見的關(guān)閉輸入流,輸出流,是程序最后的倔強(qiáng)。
public static String readFileContent(String fileName) { File file = new File(fileName); BufferedReader reader = null; StringBuffer sbf = new StringBuffer(); try { reader = new BufferedReader(new FileReader(file)); String tempStr; while ((tempStr = reader.readLine()) != null) { sbf.append(tempStr); } reader.close(); return sbf.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return sbf.toString(); }
3、throw 主要用來創(chuàng)建一個異常,因為程序中可能需要拋出一個異常,比如我們游戲服務(wù)器游戲邏輯驗證客戶端參數(shù)不通過,會主動拋出一個自定義的異常
4、throws 主要用在方法簽名上,當(dāng)我們讀寫文件或者反射的時候,如果不用try catch 就會發(fā)現(xiàn)方法簽名后有一堆的異常需要處理。異常會繼續(xù)上拋給上層的調(diào)用方法,直至有方法處理或者給系統(tǒng)。
四、自定義異常
當(dāng)Java內(nèi)置的異常都不能明確的說明異常情況的時候,需要創(chuàng)建自己的異常。
如果要自定義異常類,則繼承Exception類即可??梢栽陬愔性黾右恍┳约旱奶幚?,在創(chuàng)建異常的時候傳入,在處理異常的地方,可以根據(jù)具體的內(nèi)容進(jìn)行處理??梢钥聪孪旅娴膹棾隽鞒虘?yīng)用。
/** * @author 香菜 */ public class ErrorCodeException extends Exception { //錯誤碼 private String errorCode; //構(gòu)造函數(shù) public ErrorCodeException(String errorCode){ super(errorCode); this.errorCode = errorCode; } public String getErrorCode() { return errorCode; } }
五、異常的應(yīng)用
在游戲開發(fā)中,每個協(xié)議的處理都會驗證參數(shù)的是否合理,如果發(fā)現(xiàn)參數(shù)不合理,我們可以拋出一個自定義的參數(shù)異常,在同一的入口處進(jìn)行捕獲,解析出其中的錯誤碼,直接發(fā)給客戶端。避免了一層一層的函數(shù)返回。
1.打印堆棧
有時候在調(diào)試代碼的過程中,因為函數(shù)的調(diào)用處太多,游戲不好斷點(diǎn),我們可以在想要知道函數(shù)的調(diào)用路徑的情況下,可以隨意拋出一個異常,系統(tǒng)會打印出調(diào)用堆棧,幫忙定位問題。是不是又獲得一個小技巧。
/** * @author 香菜 */ public class Aain { public static void first(String[] args) throws Exception { second(args); } public static void second(String[] args) throws Exception { throw new Exception("1123"); } public static void main(String[] args) throws Exception { first(args); } }
2.彈出流程
/** * @author 香菜 */ public class Aain { public static void first(String[] args) throws ErrorCodeException { second(args); } public static void second(String[] args) throws ErrorCodeException { third(args); System.out.println("1111"); } public static void third(String[] args) throws ErrorCodeException { throw new ErrorCodeException("1123"); } public static void main(String[] args){ try { first(args); } catch (ErrorCodeException e) { e.printStackTrace(); } } }
從上面大堆棧打印可以看到,打印的語句沒有執(zhí)行,在游戲服務(wù)器的消息處理處捕獲一個ErrorCodeException,如果消息處理函數(shù)拋出這個異常,在入口處會捕獲并解析其中的錯誤碼返回給客戶端,可以避免一層一層的返回函數(shù)。
六、注意點(diǎn)
1、Java程序可以是多線程的。每一個線程都是一個獨(dú)立的執(zhí)行流,獨(dú)立的函數(shù)調(diào)用棧。如果程序只有一個線程,那么沒有被任何代碼處理的異常 會導(dǎo)致程序終止。如果是多線程的,那么沒有被任何代碼處理的異常僅僅會導(dǎo)致異常所在的線程結(jié)束
2、finally 不具有再次處理異常的能力
3、不要只捕獲異常而不處理異常,就會發(fā)現(xiàn)不了問題。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多文章!
相關(guān)文章
Spring?Boot統(tǒng)一處理全局異常的實戰(zhàn)教程
最近在做項目時需要對異常進(jìn)行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關(guān)于Spring?Boot統(tǒng)一處理全局異常的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號碼脫敏)
這篇文章主要介紹了大數(shù)據(jù) java hive udf函數(shù)(手機(jī)號碼脫敏),的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06關(guān)于mybatis的一級緩存和二級緩存的那些事兒
MyBatis自帶的緩存有一級緩存和二級緩存,今天我們就來學(xué)習(xí)一下,文中有非常詳細(xì)的總結(jié),對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Spring整合Kaptcha谷歌驗證碼工具的開發(fā)步驟
這篇文章主要介紹了Spring整合Kaptcha谷歌驗證碼工具的開發(fā)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄
這篇文章主要給大家介紹了關(guān)于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12javaweb servlet中使用請求轉(zhuǎn)發(fā)亂碼的實現(xiàn)
下面小編就為大家?guī)硪黄猨avaweb servlet中使用請求轉(zhuǎn)發(fā)亂碼的實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08