您好,登錄后才能下訂單哦!
前言
哎呀,媽呀,又出異常了!俗話說:“代碼虐我千百遍,我待代碼如初戀”。
小Alan最近一直在忙著工作,已經(jīng)很久沒有寫寫東西來加深自己的理解了,今天來跟大家聊聊Java異常。Java異常的體系什么的,理論知識啥的我就懶得去BB太多了,是個搞Java開發(fā)的都知道,只是可能理解的不深,這個大家可以自己多看看資料,我就簡單的說說。
什么是異常?
我不知道大家都是怎么去理解的,我的理解很簡單,那就是不正常的情況,比如我現(xiàn)在是個男的,但是我卻有著女人所獨有的東西,在我看來這尼瑪肯定是種異常,簡直不能忍。就拿上面的異常圖片來說,你應(yīng)該是有小弟弟的,但你卻沒有小弟弟,這就是不正常的情況了,所以Java這個妹子會告訴你,你應(yīng)該有小弟弟的才能辦事,或者你沒小弟弟就別來辦事,你沒小弟弟也要強上別人,那也沒法玩啊是吧?
常說我們?nèi)说淖孀谑窃常惓xception的祖宗那就是Throwable類了,除了Exception類外,Throwable還有一個子類Error 。Error這玩意就不說了,你如果遇到了它你可以把電腦砸了,呼呼呼...跟大家開個玩笑,反正這玩意不是我們程序能處理的,它在程序處理的范疇之外。至于異常Exception又分為傻傻啥的,我就不BB了,再BB就B到這上面了。
給大家隨便列舉幾個異常:
RuntimeException:你不能跑得足夠快,可能因為你太胖了。關(guān)掉你的電腦,出門鍛煉吧。
NullPointerException:你沒有狗。請你先找一只狗,比如一只布烈塔尼獵犬,然后再試一次。
IndexOutOfBoundsException:你把食指放在了無法接收的地方,重新放置,再試一次。
FileNotFoundException:一名木匠應(yīng)該總是知道他的工具放在哪里。
NotSerializableException:你正試圖把一部電影改成電視劇。
這尼瑪什么鬼?反正我是沒看懂。還好今天我要理解的對象不是上面的這些玩意,搞錯對象就不好了,看看就好了,但是別亂搞,男人都懂的,嘖..嘖..嘖...。
自定義異常
今天我們要來理解的是什么是自定義異常,為什么要使用自定義異常,使用自定義異常有哪些好處,有哪些不好的地方?
要使用自定義異常就跟你和女朋友相處一樣的,首先你得知道你為什么要跟你女朋友在一起,你女朋友有哪些好處,有哪些不好的地方,再來和你女朋友談婚論嫁過一輩子,我們就先來說說這些問題,最后再來看怎么使用自定義異常,自定義異常的實現(xiàn)和使用非常簡單,關(guān)鍵還是理解why的內(nèi)容。
為什么要使用自定義異常,有什么好處?
1.我們在工作的時候,項目是分模塊或者分功能開發(fā)的 ,基本不會你一個人開發(fā)一整個項目,使用自定義異常類就統(tǒng)一了對外異常展示的方式。
2.有時候我們遇到某些校驗或者問題時,需要直接結(jié)束掉當前的請求,這時便可以通過拋出自定義異常來結(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ā)的人越來越多了,高手數(shù)不勝數(shù),菜鳥也數(shù)不勝數(shù),把這行的行情攪的比較混亂。所以初入這行的哥們一定要有危機意識。公司都想要工資開的不高,又能做一大把事情的人,搞開發(fā)很累,但是在當前的環(huán)境下,一定要不斷的去提高自己。到了洗牌的時候,可能被淘汰的人里面就有你,除非你去做別的,不然就硬著頭皮干幾年把技術(shù)搞扎實,該復習的知識就多多復習,該學習的知識就多多學習,基礎(chǔ)扎實了就去看看底層的東西,比如理解理解Java虛擬機,研究研究Spring源碼。多關(guān)注關(guān)注前沿技術(shù)的發(fā)展,因為你現(xiàn)在所用的東西或許某一天大部分公司就不用了,或者根本滿足不了項目的需求,這都是有可能的。希望大家都能混出自己的一片天地,小Alan現(xiàn)在也還在吃土中,所以大家都在一起前行,這世界終究是屬于年輕人的,別氣餒。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。