基础知识《十》unchecked异常和checked异常
Exception和繼承自Exception的RuntimeException有什么區(qū)別呢??
Java compiler要求所有的Exception 要么被catch,要么被throw,除非這是一個(gè)RuntimeExeption (e instanceof RuntimeException)。也就是說(shuō),通常的Exception一定要被處理,也即我們所說(shuō)的 checked exception,而RuntimeException不強(qiáng)制要求處理,(當(dāng)然你自己要處理也可以),所以我們稱為unchecked exception。?
之所以區(qū)分 checked/unchecked exception,JAVA的設(shè)計(jì)思想是區(qū)分從類/方法設(shè)計(jì)者角度來(lái)看兩種不同的異常:?
一種是設(shè)計(jì)者認(rèn)為這個(gè)方法在使用過(guò)程中使用者能夠處理的異常,這些往往作為checked exception。比如一個(gè)IO系統(tǒng)的設(shè)計(jì)者會(huì)認(rèn)為諸如物理文件不存在或者介質(zhì)無(wú)法讀取等異常時(shí)很可能發(fā)生,而使用者完全可能捕獲這個(gè)異常,通過(guò)讓用戶重新輸入文件名等方式重新進(jìn)行這個(gè)操作,也就是說(shuō),這是一個(gè)可恢復(fù)的操作。所以我會(huì)在諸如 read()/write()等操作中throw 一個(gè) IOException(checked exception)。?
第二種是設(shè)計(jì)者認(rèn)為使用者不能夠處理的異常,比如我寫一個(gè)函數(shù)要求傳入的參數(shù)是個(gè)正數(shù),那么當(dāng)我發(fā)現(xiàn)使用者傳了個(gè)負(fù)數(shù)進(jìn)來(lái)時(shí),合理的預(yù)期是程序中出bug了。如果我拋出一個(gè)異常描述這件事,即使我要求調(diào)用者捕獲這個(gè)異常,他肯定也不知道該怎么辦(總不能隨便傳一個(gè)正數(shù)進(jìn)來(lái)吧)。這時(shí)候我就會(huì)拋出一個(gè)IllegalArgumentException(uncheck exception),這里面的潛臺(tái)詞是:小子,我知道你也是幫人背黑鍋的,處理不了這個(gè),你還是交給你的領(lǐng)導(dǎo)(調(diào)用你的程序)去處理這個(gè)異常吧。?
同理,當(dāng)JVM發(fā)現(xiàn)除數(shù)為0時(shí),拋出的ArithmeticException也是一個(gè)unchecked exception。?
從這里可以看出,checked exception和 unchecked exception的根本區(qū)別在于設(shè)計(jì)者認(rèn)為使用者是否能夠并且應(yīng)該處理這個(gè)異常。不幸的是,由于Java使用者水平的參差不齊,大量的unchecked exception該被設(shè)計(jì)成了checked exception,而對(duì)于真正的checked exception,又有太多被catch了之后啥都不作就悄無(wú)聲息了。尤其是不聲不響吞噬exception的行為,不但達(dá)不到設(shè)計(jì)者本來(lái)的要求(進(jìn)行恢復(fù)處理),甚至問(wèn)題更大(連 unchecked exception那種最后報(bào)錯(cuò)的效果都沒(méi)了)。?
所以, C#在異常處理上采用了完全不同的思路,把所有的的exception都設(shè)計(jì)為 unchecked exception,也就是說(shuō),它基于這樣一種思路: 我不要求任何人處理任何異常;如果你能處理,那么你就顯示catch這種異常;如果某種異常沒(méi)有人catch,那么系統(tǒng)最終會(huì)崩潰。
轉(zhuǎn)載于:https://www.cnblogs.com/abc8023/p/6216740.html
總結(jié)
以上是生活随笔為你收集整理的基础知识《十》unchecked异常和checked异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何在博客园的博客中添加可运行的JS(转
- 下一篇: yum安装Imagick及扩展