Java異常學(xué)習(xí)之自定義異常詳解
前言
哎呀,又出異常了!俗話說:“代碼虐我千百遍,我待代碼如初戀”。

小Alan最近一直在忙著工作,已經(jīng)很久沒有寫寫東西來加深自己的理解了,今天來跟大家聊聊Java異常。Java異常的體系什么的,理論知識(shí)啥的我就懶得去BB太多了,是個(gè)搞Java開發(fā)的都知道,只是可能理解的不深,這個(gè)大家可以自己多看看資料,我就簡單的說說。
常說我們?nèi)说淖孀谑窃?,異常Exception的祖宗那就是Throwable類了,除了Exception類外,Throwable還有一個(gè)子類Error 。Error這玩意就不說了,你如果遇到了它你可以把電腦砸了,呼呼呼...跟大家開個(gè)玩笑,反正這玩意不是我們程序能處理的,它在程序處理的范疇之外。至于異常Exception又分為傻傻啥的,我就不BB了,再BB就B到這上面了。
給大家隨便列舉幾個(gè)異常:
RuntimeException:你不能跑得足夠快,可能因?yàn)槟闾至?。關(guān)掉你的電腦,出門鍛煉吧。
IndexOutOfBoundsException:你把食指放在了無法接收的地方,重新放置,再試一次。
FileNotFoundException:一名木匠應(yīng)該總是知道他的工具放在哪里。
NotSerializableException:你正試圖把一部電影改成電視劇。
這什么鬼?反正我是沒看懂。還好今天我要理解的對(duì)象不是上面的這些玩意,搞錯(cuò)對(duì)象就不好了,看看就好了,但是別亂搞,男人都懂的,嘖..嘖..嘖...。
自定義異常
今天我們要來理解的是什么是自定義異常,為什么要使用自定義異常,使用自定義異常有哪些好處,有哪些不好的地方?
要使用自定義異常就跟你和女朋友相處一樣的,首先你得知道你為什么要跟你女朋友在一起,你女朋友有哪些好處,有哪些不好的地方,再來和你女朋友談婚論嫁過一輩子,我們就先來說說這些問題,最后再來看怎么使用自定義異常,自定義異常的實(shí)現(xiàn)和使用非常簡單,關(guān)鍵還是理解why的內(nèi)容。
為什么要使用自定義異常,有什么好處?
1.我們在工作的時(shí)候,項(xiàng)目是分模塊或者分功能開發(fā)的 ,基本不會(huì)你一個(gè)人開發(fā)一整個(gè)項(xiàng)目,使用自定義異常類就統(tǒng)一了對(duì)外異常展示的方式。
2.有時(shí)候我們遇到某些校驗(yàn)或者問題時(shí),需要直接結(jié)束掉當(dāng)前的請求,這時(shí)便可以通過拋出自定義異常來結(jié)束,如果你項(xiàng)目中使用了SpringMVC比較新的版本的話有控制器增強(qiáng),可以通過@ControllerAdvice注解寫一個(gè)控制器增強(qiáng)類來攔截自定義的異常并響應(yīng)給前端相應(yīng)的信息(關(guān)于springMVC控制器增強(qiáng)的知識(shí)有空再和大家分享)。
3.自定義異??梢栽谖覀冺?xiàng)目中某些特殊的業(yè)務(wù)邏輯時(shí)拋出異常,比如"中性".equals(sex),性別等于中性時(shí)我們要拋出異常,而Java是不會(huì)有這種異常的。系統(tǒng)中有些錯(cuò)誤是符合Java語法的,但不符合我們項(xiàng)目的業(yè)務(wù)邏輯。
4.使用自定義異常繼承相關(guān)的異常來拋出處理后的異常信息可以隱藏底層的異常,這樣更安全,異常信息也更加的直觀。自定義異常可以拋出我們自己想要拋出的信息,可以通過拋出的信息區(qū)分異常發(fā)生的位置,根據(jù)異常名我們就可以知道哪里有異常,根據(jù)異常提示信息進(jìn)行程序修改。比如空指針異常NullPointException,我們可以拋出信息為“xxx為空”定位異常位置,而不用輸出堆棧信息。
說完了為什么要使用自定義異常,有什么好處,我們再來看看自定義異常的毛?。?/strong>
毋庸置疑,我們不可能期待JVM(Java虛擬機(jī))自動(dòng)拋出一個(gè)自定義異常,也不能夠期待JVM會(huì)自動(dòng)處理一個(gè)自定義異常。發(fā)現(xiàn)異常、拋出異常以及處理異常的工作必須靠編程人員在代碼中利用異常處理機(jī)制自己完成。這樣就相應(yīng)的增加了一些開發(fā)成本和工作量,所以項(xiàng)目沒必要的話,也不一定非得要用上自定義異常,要能夠自己去權(quán)衡。
最后,我們來看看怎么使用自定義異常:
在 Java 中你可以自定義異常。編寫自己的異常類時(shí)需要記住下面的幾點(diǎn)。
•所有異常都必須是 Throwable 的子類。
•如果希望寫一個(gè)檢查性異常類,則需要繼承 Exception 類。
•如果你想寫一個(gè)運(yùn)行時(shí)異常類,那么需要繼承 RuntimeException 類。
可以像下面這樣定義自己的異常類:
class MyException extends Exception{ }
我們來看一個(gè)完整的實(shí)例:
package com.czgo.exception;
/**
* 自定義異常類(繼承運(yùn)行時(shí)異常)
* @author AlanLee
* @version 2016/11/26
*/
public class MyException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 錯(cuò)誤編碼
*/
private String errorCode;
/**
* 消息是否為屬性文件中的Key
*/
private boolean propertiesKey = true;
/**
* 構(gòu)造一個(gè)基本異常.
*
* @param message
* 信息描述
*/
public MyException(String message)
{
super(message);
}
/**
* 構(gòu)造一個(gè)基本異常.
*
* @param errorCode
* 錯(cuò)誤編碼
* @param message
* 信息描述
*/
public MyException(String errorCode, String message)
{
this(errorCode, message, true);
}
/**
* 構(gòu)造一個(gè)基本異常.
*
* @param errorCode
* 錯(cuò)誤編碼
* @param message
* 信息描述
*/
public MyException(String errorCode, String message, Throwable cause)
{
this(errorCode, message, cause, true);
}
/**
* 構(gòu)造一個(gè)基本異常.
*
* @param errorCode
* 錯(cuò)誤編碼
* @param message
* 信息描述
* @param propertiesKey
* 消息是否為屬性文件中的Key
*/
public MyException(String errorCode, String message, boolean propertiesKey)
{
super(message);
this.setErrorCode(errorCode);
this.setPropertiesKey(propertiesKey);
}
/**
* 構(gòu)造一個(gè)基本異常.
*
* @param errorCode
* 錯(cuò)誤編碼
* @param message
* 信息描述
*/
public MyException(String errorCode, String message, Throwable cause, boolean propertiesKey)
{
super(message, cause);
this.setErrorCode(errorCode);
this.setPropertiesKey(propertiesKey);
}
/**
* 構(gòu)造一個(gè)基本異常.
*
* @param message
* 信息描述
* @param cause
* 根異常類(可以存入任何異常)
*/
public MyException(String message, Throwable cause)
{
super(message, cause);
}
public String getErrorCode()
{
return errorCode;
}
public void setErrorCode(String errorCode)
{
this.errorCode = errorCode;
}
public boolean isPropertiesKey()
{
return propertiesKey;
}
public void setPropertiesKey(boolean propertiesKey)
{
this.propertiesKey = propertiesKey;
}
}使用自定義異常拋出異常信息:
package com.czgo.exception;
public class MyExceptionTest {
public static void main(String[] args) {
String[] sexs = {"男性","女性","中性"};
for(int i = 0; i < sexs.length; i++){
if("中性".equals(sexs[i])){
throw new MyException("你!");
}else{
System.out.println(sexs[i]);
}
}
}
}運(yùn)行結(jié)果:

就是這么簡單,我的話實(shí)現(xiàn)了很多構(gòu)造函數(shù),可以根據(jù)實(shí)際業(yè)務(wù)需求去拋出相應(yīng)的自定義異常。
結(jié)束語
現(xiàn)在搞軟件開發(fā)的人越來越多了,高手?jǐn)?shù)不勝數(shù),菜鳥也數(shù)不勝數(shù),把這行的行情攪的比較混亂。所以初入這行的哥們一定要有危機(jī)意識(shí)。公司都想要工資開的不高,又能做一大把事情的人,搞開發(fā)很累,但是在當(dāng)前的環(huán)境下,一定要不斷的去提高自己。到了洗牌的時(shí)候,可能被淘汰的人里面就有你,除非你去做別的,不然就硬著頭皮干幾年把技術(shù)搞扎實(shí),該復(fù)習(xí)的知識(shí)就多多復(fù)習(xí),該學(xué)習(xí)的知識(shí)就多多學(xué)習(xí),基礎(chǔ)扎實(shí)了就去看看底層的東西,比如理解理解Java虛擬機(jī),研究研究Spring源碼。多關(guān)注關(guān)注前沿技術(shù)的發(fā)展,因?yàn)槟悻F(xiàn)在所用的東西或許某一天大部分公司就不用了,或者根本滿足不了項(xiàng)目的需求,這都是有可能的。希望大家都能混出自己的一片天地,小Alan現(xiàn)在也還在吃土中,所以大家都在一起前行,這世界終究是屬于年輕人的,別氣餒。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用
這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Feign聲明式服務(wù)調(diào)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
Java8函數(shù)式接口UnaryOperator用法示例
這篇文章主要介紹了Java8函數(shù)式接口UnaryOperator用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Spring?Boot深入排查?java.lang.ArrayStoreException異常
這篇文章介紹了Spring?Boot深入排查?java.lang.ArrayStoreException異常,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Spring Boot集成springfox-swagger2構(gòu)建restful API的方法教程
這篇文章主要給大家介紹了關(guān)于Spring Boot集成springfox-swagger2構(gòu)建restful API的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
SpringBoot項(xiàng)目發(fā)送釘釘消息功能實(shí)現(xiàn)
在工作中的一些告警需要發(fā)送釘釘通知,有的是發(fā)給個(gè)人,有的要發(fā)到群里,這時(shí)項(xiàng)目就需要接入釘釘,實(shí)現(xiàn)發(fā)消息的功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02
關(guān)于ResponseEntity類和HttpEntity及跨平臺(tái)路徑問題
這篇文章主要介紹了關(guān)于ResponseEntity類和HttpEntity及跨平臺(tái)路徑問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java基于jdbc連接mysql數(shù)據(jù)庫操作示例
這篇文章主要介紹了Java基于jdbc連接mysql數(shù)據(jù)庫操作,結(jié)合完整實(shí)例形式分析了java使用jdbc連接mysql數(shù)據(jù)庫的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07

