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

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

就是這么簡單,我的話實現(xiàn)了很多構(gòu)造函數(shù),可以根據(jù)實際業(yè)務(wù)需求去拋出相應(yīng)的自定義異常。
結(jié)束語
現(xiàn)在搞軟件開發(fā)的人越來越多了,高手?jǐn)?shù)不勝數(shù),菜鳥也數(shù)不勝數(shù),把這行的行情攪的比較混亂。所以初入這行的哥們一定要有危機意識。公司都想要工資開的不高,又能做一大把事情的人,搞開發(fā)很累,但是在當(dāng)前的環(huán)境下,一定要不斷的去提高自己。到了洗牌的時候,可能被淘汰的人里面就有你,除非你去做別的,不然就硬著頭皮干幾年把技術(shù)搞扎實,該復(fù)習(xí)的知識就多多復(fù)習(xí),該學(xué)習(xí)的知識就多多學(xué)習(xí),基礎(chǔ)扎實了就去看看底層的東西,比如理解理解Java虛擬機,研究研究Spring源碼。多關(guān)注關(guān)注前沿技術(shù)的發(fā)展,因為你現(xiàn)在所用的東西或許某一天大部分公司就不用了,或者根本滿足不了項目的需求,這都是有可能的。希望大家都能混出自己的一片天地,小Alan現(xiàn)在也還在吃土中,所以大家都在一起前行,這世界終究是屬于年輕人的,別氣餒。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn)
本文主要介紹了SpringBoot2.X整合Spring-Cache緩存開發(fā)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
淺談java中集合的由來,以及集合和數(shù)組的區(qū)別詳解
下面小編就為大家?guī)硪黄獪\談java中集合的由來,以及集合和數(shù)組的區(qū)別詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
通過Java實現(xiàn)對PDF頁面的詳細(xì)設(shè)置
這篇文章主要介紹了通過Java實現(xiàn)對PDF頁面的詳細(xì)設(shè)置,下面的示例將介紹通過Java編程來對PDF頁面進行個性化設(shè)置的方法,包括設(shè)置頁面大小、頁邊距、紙張方向、頁面旋轉(zhuǎn)等,需要的朋友可以參考下2019-07-07
如何使用MybatisPlus的SQL注入器提升批量插入性能
本文給大家介紹如何使用MybatisPlus的SQL注入器提升批量插入性能,以實戰(zhàn)視角講述如何利用該特性提升MybatisPlus?的批量插入性能,感興趣的朋友跟隨小編一起看看吧2024-05-05
SpringCloud基于RestTemplate微服務(wù)項目案例解析
這篇文章主要介紹了SpringCloud基于RestTemplate微服務(wù)項目案例,在寫SpringCloud搭建微服務(wù)之前,先搭建一個不通過springcloud只通過SpringBoot和Mybatis進行模塊之間通訊,通過一個案例給大家詳細(xì)說明,需要的朋友可以參考下2022-05-05
spring整合redis以及使用RedisTemplate的方法
本篇文章主要介紹了spring整合redis以及使用RedisTemplate的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
詳解Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀
這篇文章主要介紹了Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

