哎呀,媽呀,又出異常了!俗話說:「代碼虐我千百遍,我待代碼如初戀」。前端
小Alan最近一直在忙着工做,已經好久沒有寫寫東西來加深本身的理解了,今天來跟你們聊聊Java異常。Java異常的體系什麼的,理論知識啥的我就懶得去BB太多了,是個搞Java開發的都知道,只是可能理解的不深,這個你們能夠本身多看看資料,我就簡單的說說。spring
什麼是異常?編程
我不知道你們都是怎麼去理解的,個人理解很簡單,那就是不正常的狀況,好比我如今是個男的,可是我卻有着女人所獨有的東西,在我看來這尼瑪確定是種異常,簡直不能忍。就拿上面的異常圖片來講,你應該是有小弟弟的,但你卻沒有小弟弟,這就是不正常的狀況了,因此Java這個妹子會告訴你,你應該有小弟弟的才能辦事,或者你沒小弟弟就別來辦事,你沒小弟弟也要強上別人,那也無法玩啊是吧?安全
常說咱們人的祖宗是猿,異常Exception的祖宗那就是Throwable類了,除了Exception類外,Throwable還有一個子類Error 。Error這玩意就不說了,你若是遇到了它你能夠把電腦砸了,呼呼呼...跟你們開個玩笑,反正這玩意不是咱們程序能處理的,它在程序處理的範疇以外。至於異常Exception又分爲傻傻啥的,我就不BB了,再BB就B到這上面了。ide
給你們隨便列舉幾個異常:函數
RuntimeException:你不能跑得足夠快,可能由於你太胖了。關掉你的電腦,出門鍛鍊吧。工具
NullPointerException:你沒有狗。請你先找一隻狗,好比一隻布烈塔尼獵犬,而後再試一次。學習
IndexOutOfBoundsException:你把食指放在了沒法接收的地方,從新放置,再試一次。this
FileNotFoundException:一名木匠應該老是知道他的工具放在哪裏。編碼
NotSerializableException:你正試圖把一部電影改爲電視劇。
這尼瑪什麼鬼?反正我是沒看懂。還好今天我要理解的對象不是上面的這些玩意,搞錯對象就很差了,看看就行了,可是別亂搞,男人都懂的,嘖..嘖..嘖...。
自定義異常
今天咱們要來理解的是什麼是自定義異常,爲何要使用自定義異常,使用自定義異常有哪些好處,有哪些很差的地方?
要使用自定義異常就跟你和女友相處同樣的,首先你得知道你爲何要跟你女友在一塊兒,你女友有哪些好處,有哪些很差的地方,再來和你女友談婚論嫁過一生,咱們就先來講說這些問題,最後再來看怎麼使用自定義異常,自定義異常的實現和使用很是簡單,關鍵仍是理解why的內容。
爲何要使用自定義異常,有什麼好處?
1.咱們在工做的時候,項目是分模塊或者分功能開發的 ,基本不會你一我的開發一整個項目,使用自定義異常類就統一了對外異常展現的方式。
2.有時候咱們遇到某些校驗或者問題時,須要直接結束掉當前的請求,這時即可以經過拋出自定義異常來結束,若是你項目中使用了SpringMVC比較新的版本的話有控制器加強,能夠經過@ControllerAdvice註解寫一個控制器加強類來攔截自定義的異常並響應給前端相應的信息(關於springMVC控制器加強的知識有空再和你們分享)。
3.自定義異常能夠在咱們項目中某些特殊的業務邏輯時拋出異常,好比"中性".equals(sex),性別等於中性時咱們要拋出異常,而Java是不會有這種異常的。系統中有些錯誤是符合Java語法的,但不符合咱們項目的業務邏輯。
4.使用自定義異常繼承相關的異常來拋出處理後的異常信息能夠隱藏底層的異常,這樣更安全,異常信息也更加的直觀。自定義異常能夠拋出咱們本身想要拋出的信息,能夠經過拋出的信息區分異常發生的位置,根據異常名咱們就能夠知道哪裏有異常,根據異常提示信息進行程序修改。好比空指針異常NullPointException,咱們能夠拋出信息爲「xxx爲空」定位異常位置,而不用輸出堆棧信息。
說完了爲何要使用自定義異常,有什麼好處,咱們再來看看自定義異常的毛病:
毋庸置疑,咱們不可能期待JVM(Java虛擬機)自動拋出一個自定義異常,也不可以期待JVM會自動處理一個自定義異常。發現異常、拋出異常以及處理異常的工做必須靠編程人員在代碼中利用異常處理機制本身完成。這樣就相應的增長了一些開發成本和工做量,因此項目不必的話,也不必定非得要用上自定義異常,要可以本身去權衡。
最後,咱們來看看怎麼使用自定義異常:
在 Java 中你能夠自定義異常。編寫本身的異常類時須要記住下面的幾點。
能夠像下面這樣定義本身的異常類:
class MyException extends Exception{ }
咱們來看一個完整的實例:
1 package com.czgo.exception; 2 3 /** 4 * 自定義異常類(繼承運行時異常) 5 * @author AlanLee 6 * @version 2016/11/26 7 */ 8 public class MyException extends RuntimeException { 9 10 private static final long serialVersionUID = 1L; 11 12 /** 13 * 錯誤編碼 14 */ 15 private String errorCode; 16 17 /** 18 * 消息是否爲屬性文件中的Key 19 */ 20 private boolean propertiesKey = true; 21 22 /** 23 * 構造一個基本異常. 24 * 25 * @param message 26 * 信息描述 27 */ 28 public MyException(String message) 29 { 30 super(message); 31 } 32 33 /** 34 * 構造一個基本異常. 35 * 36 * @param errorCode 37 * 錯誤編碼 38 * @param message 39 * 信息描述 40 */ 41 public MyException(String errorCode, String message) 42 { 43 this(errorCode, message, true); 44 } 45 46 /** 47 * 構造一個基本異常. 48 * 49 * @param errorCode 50 * 錯誤編碼 51 * @param message 52 * 信息描述 53 */ 54 public MyException(String errorCode, String message, Throwable cause) 55 { 56 this(errorCode, message, cause, true); 57 } 58 59 /** 60 * 構造一個基本異常. 61 * 62 * @param errorCode 63 * 錯誤編碼 64 * @param message 65 * 信息描述 66 * @param propertiesKey 67 * 消息是否爲屬性文件中的Key 68 */ 69 public MyException(String errorCode, String message, boolean propertiesKey) 70 { 71 super(message); 72 this.setErrorCode(errorCode); 73 this.setPropertiesKey(propertiesKey); 74 } 75 76 /** 77 * 構造一個基本異常. 78 * 79 * @param errorCode 80 * 錯誤編碼 81 * @param message 82 * 信息描述 83 */ 84 public MyException(String errorCode, String message, Throwable cause, boolean propertiesKey) 85 { 86 super(message, cause); 87 this.setErrorCode(errorCode); 88 this.setPropertiesKey(propertiesKey); 89 } 90 91 /** 92 * 構造一個基本異常. 93 * 94 * @param message 95 * 信息描述 96 * @param cause 97 * 根異常類(能夠存入任何異常) 98 */ 99 public MyException(String message, Throwable cause) 100 { 101 super(message, cause); 102 } 103 104 public String getErrorCode() 105 { 106 return errorCode; 107 } 108 109 public void setErrorCode(String errorCode) 110 { 111 this.errorCode = errorCode; 112 } 113 114 public boolean isPropertiesKey() 115 { 116 return propertiesKey; 117 } 118 119 public void setPropertiesKey(boolean propertiesKey) 120 { 121 this.propertiesKey = propertiesKey; 122 } 123 124 }
使用自定義異常拋出異常信息:
1 package com.czgo.exception; 2 3 public class MyExceptionTest { 4 5 public static void main(String[] args) { 6 7 String[] sexs = {"男性","女性","中性"}; 8 for(int i = 0; i < sexs.length; i++){ 9 if("中性".equals(sexs[i])){ 10 throw new MyException("你全家都是中性!"); 11 }else{ 12 System.out.println(sexs[i]); 13 } 14 } 15 } 16 }
運行結果:
就是這麼簡單,個人話實現了不少構造函數,能夠根據實際業務需求去拋出相應的自定義異常。
結束語:如今搞軟件開發的人愈來愈多了,高手數不勝數,菜鳥也數不勝數,把這行的行情攪的比較混亂。因此初入這行的哥們必定要有危機意識。公司都想要工資開的不高,又能作一大把事情的人,搞開發很累,可是在當前的環境下,必定要不斷的去提升本身。到了洗牌的時候,可能被淘汰的人裏面就有你,除非你去作別的,否則就硬着頭皮幹幾年把技術搞紮實,該複習的知識就多多複習,該學習的知識就多多學習,基礎紮實了就去看看底層的東西,好比理解理解Java虛擬機,研究研究Spring源碼。多關注關注前沿技術的發展,由於你如今所用的東西或許某一天大部分公司就不用了,或者根本知足不了項目的需求,這都是有可能的。但願你們都能混出本身的一片天地,小Alan如今也還在吃土中,因此你們都在一塊兒前行,這世界終究是屬於年輕人的,彆氣餒。