(轉(zhuǎn))Java的checked和unchecked異常

Java異常分為兩種類型昧廷,checked異常和unchecked異常,另一種叫法是異常和錯(cuò)誤甚侣。
簡(jiǎn)單地講,checked是可以在執(zhí)行過(guò)程中恢復(fù)的间学,而unchecked異常則是無(wú)法處理的錯(cuò)誤殷费。

checked異常:

1、表示無(wú)效低葫,不是程序中可以預(yù)測(cè)的详羡。比如無(wú)效的用戶輸入,文件不存在嘿悬,網(wǎng)絡(luò)或者數(shù)據(jù)庫(kù)鏈接錯(cuò)誤实柠。這些都是外在的原因,都不是程序內(nèi)部可以控制的鹊漠。

2主到、必須在代碼中顯式地處理茶行。比如try-catch塊處理躯概,或者給所在的方法加上throws說(shuō)明,將異常拋到調(diào)用棧的上一層畔师。

3娶靡、繼承自java.lang.Exception(java.lang.RuntimeException除外)。

unchecked異常:

1看锉、表示錯(cuò)誤姿锭,程序的邏輯錯(cuò)誤。是RuntimeException的子類伯铣,比如IllegalArgumentException, NullPointerException和IllegalStateException呻此。

2、不需要在代碼中顯式地捕獲unchecked異常做處理腔寡。

3焚鲜、繼承自java.lang.RuntimeException(而java.lang.RuntimeException繼承自java.lang.Exception)。

Java中的checked異常需要在代碼中顯式地通過(guò)try-catch捕獲或者再拋出,如果不需要對(duì)這個(gè)異常做處理忿磅,可以簡(jiǎn)地將異常再次拋出糯彬,這種異常存在一點(diǎn)不足,很多人習(xí)慣在代碼中直接寫(xiě)一個(gè)空的catch塊葱她,這樣不但使代碼變得有些冗余和“丑陋”撩扒,而且給調(diào)試帶來(lái)麻煩,增加了代碼維護(hù)的難度吨些。所以有人說(shuō)checked使代碼變的冗長(zhǎng)搓谆,空的catch塊也沒(méi)什么意義,所以checked異常應(yīng)該從Java標(biāo)準(zhǔn)中去除豪墅,像C#中就沒(méi)有checked異常的概念挽拔,C#中不強(qiáng)制顯式地捕獲異常。
Java異常之所以會(huì)分為這兩種但校,應(yīng)該是出于如下考慮:
checked異丑ψ纾可以幫助開(kāi)發(fā)人員意識(shí)到哪一行有可能會(huì)出現(xiàn)異常,因?yàn)镴ava的API已經(jīng)說(shuō)明了調(diào)用哪些方法可能會(huì)拋出異常状囱。如果不做處理編譯就不能通過(guò)术裸,從某種程度上說(shuō),這種做法可以避免程序的一些錯(cuò)誤亭枷。

兩個(gè)簡(jiǎn)單的例子:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Main {
    public static void main(String[] args) {
        File f = new File("C:\test.txt");
        FileReader r = new FileReader(f); //A
        BufferedReader br = new BufferedReader(r);
        br.readLine(); //B
        br.close(); //C
    }
}

這段代碼不能通過(guò)編譯袭艺,原因是A,B和C行會(huì)拋出IOException叨粘,必須將這段代碼放入try-catch塊中猾编,或者給main方法加上throws IOException才能編譯。

public class Main {
    public static void main(String[] args) {
        int a = 0;
        int b = 100;
        int c = b/a;
    }
}

可以編譯升敲,但執(zhí)行會(huì)報(bào)錯(cuò)
Exception in thread “main” java.lang.ArithmeticException: / by zero at Main.main(Main.java:13)
ArithmeticException是一個(gè)unchecked異常答倡。

自定義異常

checked異常

自定義異常類InvalidUrlException

public class InvalidUrlException extends Exception {
    public InvalidUrlException(String s){
        super(s);
    }
}
public class Main {
    public static void getRemoteData(String url) throws InvalidUrlException{
        if(isValidUrl(url)){
        //獲取遠(yuǎn)程數(shù)據(jù)
        }
        else {
            throw new InvalidUrlException("Invalid URL: " + url);
        }
    }

    public static boolean isValidUrl(String url){
        .... //驗(yàn)證URL是否有效
    }

    public static void main(String[] args) {
        getRemoteData(args[0]);
    }
}

如果在main方法里調(diào)用getRemoteData,有兩種做法驴党,一種是try-catch瘪撇,另一種則是直接給main加上throws InvalidUrlException。

unchecked異常

如果將InvalidUrlException改成extends RuntimeException港庄,那么main不需要再加throws或者try-catch倔既。

選擇checked還是unchecked異常?

一些Java書(shū)籍建議使用checked異常處理程序中所有可恢復(fù)的異常鹏氧,而用unchecked異常作為無(wú)法恢復(fù)的錯(cuò)誤渤涌。但是實(shí)際上那些繼承自RuntimeException的Java異常大多也可以在程序中恢復(fù)的,比如NullPointerException把还、IllegalArgumentExceptions实蓬、除0異常等等都可以通過(guò)捕獲處理使程序繼續(xù)運(yùn)行稿存。只有一些特殊情況會(huì)破壞程序的執(zhí)行,比如啟動(dòng)的時(shí)候讀取配置文件瞳秽,如果配置文件不存在或者有嚴(yán)重錯(cuò)誤瓣履,程序只好退出。

以下是是支持和反對(duì)checked異常的一些觀點(diǎn):

1练俐、編譯器強(qiáng)制捕獲或者拋出unchecked異常使開(kāi)發(fā)人員時(shí)刻記著要處理異常袖迎。

2、拋出checked異常的方法必須聲明throws腺晾,throws成為了方法或者接口的一部分燕锥,給后續(xù)版本增加或者修改方法的異常帶來(lái)不便。

3悯蝉、unchecked異常不需要顯式地處理反而使異常處理變的困難归形。

4、調(diào)用checked異常的方法鼻由,就必須處理這個(gè)方法的異常暇榴,這使得上層的調(diào)用者代碼混亂。
選擇checked還是unchecked都是由你自己決定的蕉世,很難說(shuō)哪種就一定正確蔼紧,反之就一定錯(cuò)誤。目前比較流行的語(yǔ)言中狠轻,Java似乎是唯一支持checked異常的語(yǔ)言奸例,其他語(yǔ)言都只有unchecked異常。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末向楼,一起剝皮案震驚了整個(gè)濱河市查吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湖蜕,老刑警劉巖逻卖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異重荠,居然都是意外死亡箭阶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門戈鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嘹叫,你說(shuō)我怎么就攤上這事婆殿。” “怎么了罩扇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵婆芦,是天一觀的道長(zhǎng)怕磨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)消约,這世上最難降的妖魔是什么肠鲫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮或粮,結(jié)果婚禮上导饲,老公的妹妹穿的比我還像新娘。我一直安慰自己氯材,他們只是感情好渣锦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著氢哮,像睡著了一般袋毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冗尤,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天听盖,我揣著相機(jī)與錄音,去河邊找鬼裂七。 笑死媳溺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碍讯。 我是一名探鬼主播悬蔽,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捉兴!你這毒婦竟也來(lái)了蝎困?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倍啥,失蹤者是張志新(化名)和其女友劉穎禾乘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虽缕,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡始藕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氮趋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍派。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剩胁,靈堂內(nèi)的尸體忽然破棺而出诉植,到底是詐尸還是另有隱情,我是刑警寧澤昵观,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布晾腔,位于F島的核電站舌稀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灼擂。R本人自食惡果不足惜壁查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剔应。 院中可真熱鬧睡腿,春花似錦、人聲如沸领斥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)月洛。三九已至何恶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚼黔,已是汗流浹背细层。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唬涧,地道東北人疫赎。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碎节,于是被迫代替她去往敵國(guó)和親捧搞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 通俗編程——白話JAVA異常機(jī)制 - 代碼之道狮荔,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語(yǔ)閱讀 3,179評(píng)論 0 25
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法胎撇,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法殖氏,繼承相關(guān)的語(yǔ)法晚树,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • 六種異常處理的陋習(xí) 你覺(jué)得自己是一個(gè)Java專家嗎雅采?是否肯定自己已經(jīng)全面掌握了Java的異常處理機(jī)制爵憎?在下面這段代...
    Executing閱讀 1,329評(píng)論 0 6
  • 一個(gè)男孩救了一只落巢的小鳥(niǎo),他把它帶回家婚瓜。慢慢它長(zhǎng)出了羽毛宝鼓,鮮艷地像就像掉落人間的晚霞∪蛴妫可是他從來(lái)沒(méi)有聽(tīng)過(guò)它...
    Exploitor閱讀 352評(píng)論 0 1
  • 剛開(kāi)始找到這份財(cái)務(wù)工作感覺(jué)是上天給了我一個(gè)很好的機(jī)會(huì)席函,工作進(jìn)行了兩三個(gè)月覺(jué)得自己快呆不下去了,因?yàn)楹芏嗍挛叶紵o(wú)...
    孤娘娘閱讀 122評(píng)論 0 0