JAVA異常和自定義異常處理方式
廢話(huà)前言
作為一個(gè)碼農(nóng)想必對(duì)異常這一塊滴已經(jīng)是相當(dāng)熟悉了就是我們常說(shuō)的try/catch/finally嗎,然后拋出捕獲的異常信息,那么當(dāng)我們?cè)陂_(kāi)發(fā)中有些異常需要我們給出特定的提示統(tǒng)一對(duì)異常進(jìn)行處理展示可能就會(huì)用到自定義異常。
第一:先說(shuō)一下平時(shí)常用常見(jiàn)的異常
(1)運(yùn)行時(shí)異常(checked exception)
繼承自java.lang. RuntimeException類(lèi)
常見(jiàn)5種:
ClassCastException
(類(lèi)型轉(zhuǎn)換異常)IndexOutOfBoundsException
(數(shù)組越界)NullPointerException
(空指針)ArrayStoreException
(數(shù)據(jù)存儲(chǔ)異常,操作數(shù)組時(shí)類(lèi)型不一致)BufferOverflowException
(IO操作的異常)
(2)非運(yùn)行時(shí)異常(unchecked exception)
繼承自java.lang.Exception類(lèi)
常見(jiàn):
Java.lang.ClassNotFoundException Java.lang.NoSuchMetodException java.io.IOException
先給出語(yǔ)法:
try{ //try塊中放可能發(fā)生異常的代碼。 //如果執(zhí)行完try且不發(fā)生異常,則接著去執(zhí)行finally塊和finally后面的代碼(如果有的話(huà))。 //如果發(fā)生異常,則嘗試去匹配catch塊。 }catch(SQLException SQLexception){ //每一個(gè)catch塊用于捕獲并處理一個(gè)特定的異常,或者這異常類(lèi)型的子類(lèi)。Java7中可以將多個(gè)異常聲明在一個(gè)catch中。 //catch后面的括號(hào)定義了異常類(lèi)型和異常參數(shù)。如果異常與之匹配且是最先匹配到的,則虛擬機(jī)將使用這個(gè)catch塊來(lái)處理異常。 //在catch塊中可以使用這個(gè)塊的異常參數(shù)來(lái)獲取異常的相關(guān)信息。異常參數(shù)是這個(gè)catch塊中的局部變量,其它塊不能訪(fǎng)問(wèn)。 //如果當(dāng)前try塊中發(fā)生的異常在后續(xù)的所有catch中都沒(méi)捕獲到,則先去執(zhí)行finally,然后到這個(gè)函數(shù)的外部caller中去匹配異常處理器。 //如果try中沒(méi)有發(fā)生異常,則所有的catch塊將被忽略。 }catch(Exception exception){ //… }finally{ //finally塊通常是可選的。 //無(wú)論異常是否發(fā)生,異常是否匹配被處理,finally都會(huì)執(zhí)行。 //一個(gè)try至少要有一個(gè)catch塊,否則, 至少要有1個(gè)finally塊。但是finally不是用來(lái)處理異常的,finally不會(huì)捕獲異常。 //finally主要做一些清理工作,如流的關(guān)閉,數(shù)據(jù)庫(kù)連接的關(guān)閉等。 }
代碼例子:
public class Class1 { public static void main(String[] args) throws Exception { try { List<String> list = new ArrayList<String>(); Class2 c = new Class2(); c.aa(list); System.out.println("打印"); }catch(Exception e) { System.out.println(">>>>>>>>>>>main"); e.printStackTrace(); }finally { System.out.println("main finally"); } } } public class Class2 { public String aa(List<String> list) throws Exception{ try { list.get(10); }catch(Exception e) { System.out.println(">>>>>>class2 aa="+e.getMessage()); e.printStackTrace(); throw e; //必須throw調(diào)用方法還會(huì)停止向下運(yùn)行,并被調(diào)用方法接住并拋出 }finally { System.out.println("finally"); } return null; } }
第二:說(shuō)一下我用到的自定義異常
自定義異常的好處是什么?
(1)統(tǒng)一了對(duì)外異常展示的方式給前臺(tái)或者各個(gè)服務(wù)接口
(2)使用自定義異常繼承相關(guān)的異常來(lái)拋出處理后的異常信息可以隱藏底層的異常,這樣更安全,異常信息也更加的直觀(guān)
我是如何在項(xiàng)目中使用的場(chǎng)景?
直接上代碼
一:自定義異常類(lèi)
public class ExceptionMessage extends Exception { public ExceptionMessage(String message) { super(message); } }
二:自定義異常處理類(lèi)
@RestControllerAdvice public class MyExceptionHandler { @ExceptionHandler(ExceptionMessage.class) public String handlerMyException(ExceptionMessage ex) { //BaseRspsMsg自定義錯(cuò)誤代碼 BaseRspsMsg baseRspsMsg = BaseRspsMsg.build(BaseRspsMsg.BIZ_CODE_00001_FAILE,ex.getMessage()); return baseRspsMsg.toJsonStr(); } }
三:代碼調(diào)用
boolean isTrue = 處理邏輯是否符合;
if (!isTrue) { errDesc = "ERROR_異常信息描述!" ; throw new ExceptionMessage(errDesc); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring依賴(lài)注入的三種方式以及優(yōu)缺點(diǎn)
IoC?和?DI?是?Spring?中最重要的兩個(gè)概念,其中?IoC(Inversion?of?Control)為控制反轉(zhuǎn)的思想,而?DI(Dependency?Injection)依賴(lài)注入為其(IoC)具體實(shí)現(xiàn)。那么?DI?實(shí)現(xiàn)依賴(lài)注入的方式有幾種?這些注入方式又有什么不同?本文就來(lái)和大家一起詳細(xì)聊聊2022-08-08j2Cache線(xiàn)上異常排查問(wèn)題解決記錄分析
這篇文章主要為大家介紹了關(guān)于j2Cache線(xiàn)上異常排查的問(wèn)題解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02Spring?Data?JPA命名約定查詢(xún)實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Spring?Data?JPA命名約定查詢(xún)實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12詳解Java如何實(shí)現(xiàn)有效的并發(fā)處理
隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,現(xiàn)代軟件系統(tǒng)對(duì)于并發(fā)性能的要求越來(lái)越高,如何學(xué)習(xí)和掌握并發(fā)編程技術(shù)成為了Java開(kāi)發(fā)人員必備的技能之一,本文主要介紹了Java并發(fā)編程的相關(guān)概念、原理和實(shí)踐技巧,感興趣的可以了解下2023-11-11Java中計(jì)算集合中元素的出現(xiàn)次數(shù)統(tǒng)計(jì)
本文主要介紹了Java中計(jì)算集合中元素的出現(xiàn)次數(shù)統(tǒng)計(jì),使用Collections類(lèi)配合HashMap來(lái)統(tǒng)計(jì)和java lamb 計(jì)算這兩種方式,具有一定的參考價(jià)值,感興趣可以了解一下2024-02-02