第60條:優(yōu)先使用標(biāo)準(zhǔn)的異常

??????? 專家級程序員與缺乏經(jīng)驗的程序員一個最主要的區(qū)別在于耸峭,專家追求并且通常也能夠?qū)崿F(xiàn)髙度的代碼重用上渴。代碼重用是值得提倡的,這是一條通用的規(guī)則犬钢,異常也不例外。java平臺類庫提供了一組基本的未受檢的異常?思灰,它們滿足了絕大多數(shù)API的異常拋出需要玷犹。本條目中,我們將討論這些常見的可重用異常洒疚。

??????? 重用現(xiàn)在的異常有多方面的好處歹颓。其中最主要的好處是,它使你的API更加容易學(xué)習(xí)和使用油湖,因為它與程序員已經(jīng)熟悉的習(xí)慣用法是一致的.第二個好處是巍扛,對于用到這些API的程序而言,它們的可讀性會更好乏德,因為它們不會出現(xiàn)很多程序員不熟悉的異常电湘。最后(也不是最重要的)一點是,異常類越少鹅经,意味著內(nèi)存印跡(footprint)就越小寂呛,裝載這些類的時間開銷也越少。

? ? ? 最經(jīng)常被重用的異常是IllegalArgumentException瘾晃。當(dāng)調(diào)用者傳遞的參數(shù)值不合適的時候贷痪,往往就會拋出這個異常。例如蹦误,假設(shè)一個參數(shù)代表了“某個動作的重復(fù)次數(shù)”劫拢,如果程序員給這個參數(shù)傳遞了一個負數(shù)肉津,就會拋出這個異常。

??????? 另一個經(jīng)常被重用的異常是IllegalStateExccption舱沧。如果因為接收對象的狀態(tài)而使調(diào)用非法妹沙,通常就會拋出這個異常。例如熟吏,如果在某個對象被正確地初始化之前距糖,調(diào)用者就企圖使用這個對象,就會拋出這個異常牵寺。

? ? ? ? 可以這么說悍引,所有錯誤的方法調(diào)用都可以被歸結(jié)為非法參數(shù)或者非法狀態(tài),但是帽氓,其他還有一些標(biāo)準(zhǔn)異常也被用于某些特定情況下的非法參數(shù)和非法狀態(tài)趣斤。如果調(diào)用者在某個不允許null值的參數(shù)中傳遞了null,習(xí)慣的做法就是拋出NullPointerException,而不是IllegalArgumentException。同樣地黎休,如果調(diào)用者在表示序列下標(biāo)的參數(shù)中傳遞了越界的值浓领,應(yīng)該拋出的就是IndexOutOfBoundsException,而不是IllegalArgumentException

?????? 另一個值得了解的通用異常是ConcurremModificationException。如果一個對象被設(shè)計為專用于單線程或者與外部同步機制配合使用势腮,一旦發(fā)現(xiàn)它正在(或已經(jīng))被并發(fā)地修改镊逝,就應(yīng)該拋出這個異常。

??????? 最后一個值得注意的通用異常是UnsupportedOperationException嫉鲸。如果對象不支持所請求的操作,就會拋出這個異常歹啼。與本條目中討論的其他異常相比玄渗,它很少用到,因為絕大多數(shù)對象都會支持它們實現(xiàn)的所有方法狸眼。如果接口的具體實現(xiàn)沒有實現(xiàn)該接口所定義的一個或者多個可選操作藤树,它就可以使用這個異常。例如拓萌,對于只支持追加操作的List實現(xiàn)岁钓,如果有人試圖從列表中刪除元素,它就會拋出這個異常微王。

以下概括了最常見的可重用異常屡限。

異 常 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 使用場合

IllegalArgumentExccplion 非null的參數(shù)值不正確

lllegalStateException 對于方法調(diào)用而言,對象狀態(tài)不合適

NullPointerExceplion 在禁止使用null的情況下參數(shù)值為null

IndexOutOfBoundsException 下標(biāo)參敗值越界

ConcurrentModificationExcepiion 在禁止并發(fā)修改的情況下炕倘,檢測到對象的并發(fā)修改

UnsupportedOperationExccption 對象不支持用戶請求的方法

??????? 雖然它們是Java平臺類庫中迄今為止最被重用的異常钧大,但是,在條件許可的情況下罩旋,其他的異常也可以被重用啊央。例如眶诈,如果要實現(xiàn)諸如復(fù)數(shù)或者有理數(shù)之類的算術(shù)對象,也可以重用ArithmeticException和NumberFormatException瓜饥。如果某個異常能夠滿足你的需要逝撬,就不要猶像,使用就是乓土,不過宪潮,一定要確保拋出異常的條件與該異常的文檔中描述的條件一致。這種重用必須邊立在語義的基礎(chǔ)上帐我,而不是建立在名稱的基礎(chǔ)之上坎炼。而且,如果希望稍微增加更多的失敗-捕獲(failure-capture)信息(見第63條)拦键,可以放心地把現(xiàn)有的異常進行子類化谣光。

??????? 最后,一定要清楚芬为,選擇重用哪個異常并不總是那么精確萄金,因為上表中的“使用場合”并不是相互排斥的。例如媚朦,考慮表示一副紙牌的對象氧敢。假設(shè)有個處理發(fā)牌操作的方法,它的參數(shù)是發(fā)一手牌的紙牌張數(shù)询张。假設(shè)調(diào)用者在這個參數(shù)中傳遞的值大于整副紙牌的剩余張數(shù)孙乖。這種情形既可以被解釋為IllegalArgurnemException(handSize參數(shù)的值太大),也可以被解釋為IllegalStateException(相對于客戶的請求而言份氧,紙牌對象包含的紙牌太少)唯袄。在這個例子中,感覺IllegalArgumemException要好一些蜗帜,不過恋拷,這里并沒有嚴(yán)格的規(guī)則。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厅缺,一起剝皮案震驚了整個濱河市蔬顾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湘捎,老刑警劉巖诀豁,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窥妇,居然都是意外死亡且叁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門秩伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逞带,“玉大人欺矫,你說我怎么就攤上這事≌姑ィ” “怎么了穆趴?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遇汞。 經(jīng)常有香客問我未妹,道長,這世上最難降的妖魔是什么空入? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任络它,我火速辦了婚禮,結(jié)果婚禮上歪赢,老公的妹妹穿的比我還像新娘化戳。我一直安慰自己,他們只是感情好埋凯,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布点楼。 她就那樣靜靜地躺著,像睡著了一般白对。 火紅的嫁衣襯著肌膚如雪掠廓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天甩恼,我揣著相機與錄音蟀瞧,去河邊找鬼。 笑死条摸,一個胖子當(dāng)著我的面吹牛悦污,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屈溉,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抬探!你這毒婦竟也來了子巾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤小压,失蹤者是張志新(化名)和其女友劉穎线梗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怠益,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡仪搔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜻牢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烤咧。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡偏陪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煮嫌,到底是詐尸還是另有隱情笛谦,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布昌阿,位于F島的核電站饥脑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懦冰。R本人自食惡果不足惜灶轰,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刷钢。 院中可真熱鬧笋颤,春花似錦、人聲如沸闯捎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓤鼻。三九已至秉版,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茬祷,已是汗流浹背清焕。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祭犯,地道東北人秸妥。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像沃粗,于是被迫代替她去往敵國和親粥惧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容