從根本上講所有的異常都屬于Throwable的子類鬓梅,從大的方面講分為Error(錯(cuò)誤)和Exception(異常)。Eror是程序無(wú)法處理的異常谨湘,當(dāng)發(fā)生Error時(shí)程序線程會(huì)終止運(yùn)行绽快。我們一般意義上講的異常就是指的Exception,這也是面試官常問的問題紧阔。
下面就簡(jiǎn)單說(shuō)一下關(guān)于Exception(以下都簡(jiǎn)稱異常)的一點(diǎn)理解坊罢。
異常分為運(yùn)行時(shí)異常(RuntimeException,又叫非檢查時(shí)異常)和非運(yùn)行時(shí)異常(又叫檢查異常)擅耽。下面列舉一下常見的運(yùn)行時(shí)異常:
NullPointerException - 試圖訪問一空對(duì)象的變量活孩、方法或空數(shù)組的元素
ArrayIndexOutOfBoundsException - 數(shù)組越界訪問
NoClassDefFoundException - JAVA運(yùn)行時(shí)系統(tǒng)找不到所引用的類
ArithmeticException - 算術(shù)運(yùn)算中,被0除或模除
ArrayStoreException - 數(shù)據(jù)存儲(chǔ)異常乖仇,寫數(shù)組操作時(shí)憾儒,對(duì)象或數(shù)據(jù)類型不兼容
ClassCastException - 類型轉(zhuǎn)換異常
IllegalArgumentException - 方法的參數(shù)無(wú)效
IllegalThreadStateException - 試圖非法改變線程狀態(tài)询兴,比方說(shuō)試圖啟動(dòng)一已經(jīng)運(yùn)行的線程
NumberFormatException - 數(shù)據(jù)格式異常,試圖把一字符串非法轉(zhuǎn)換成數(shù)值(或相反)
SecurityException - 如果Applet試圖執(zhí)行一被WWW瀏覽器安全設(shè)置所禁止的操作
IncompatibleClassChangeException - 如改變了某一類定義起趾,卻沒有重新編譯其他引用了這個(gè)類的對(duì)象诗舰。如某一成員變量的聲明被從靜態(tài)改變?yōu)榉庆o態(tài),但其他引用了這個(gè)變量的類卻沒有重新編譯训裆,或者相反眶根。如刪除了類聲明中的某一域或方法,但沒有重新編譯那些引用了這個(gè)域或方法的類
OutOfMemoryException - 內(nèi)存不足边琉,通常發(fā)生于創(chuàng)建對(duì)象之時(shí)
IncompatibleTypeException - 試圖實(shí)例化一個(gè)接口属百,Java運(yùn)行時(shí)系統(tǒng)將拋出這個(gè)異常
UnsatisfiedLinkException - 如果所需調(diào)用的方法是C函數(shù),但Java運(yùn)行時(shí)系統(tǒng)卻無(wú)法連接這個(gè)函數(shù)
InternalException - 系統(tǒng)內(nèi)部故障所導(dǎo)致的異常情況变姨,可能是因?yàn)镴ava運(yùn)行時(shí)系統(tǒng)本身的原因族扰。如果發(fā)現(xiàn)一可重現(xiàn)的InternalException,可以直接給Sun公司發(fā)電郵java@java.Sun.com
前三種異常是我在開發(fā)中經(jīng)常性遇到的問題钳恕,對(duì)于運(yùn)行時(shí)異常通過(guò)它的別名(非檢查是異常)我們可以知道這些異常不是我們寫代碼的時(shí)候可以檢查到的别伏,而是程序在運(yùn)行的時(shí)候可能會(huì)發(fā)生的,也就是說(shuō)這是在業(yè)務(wù)邏輯上可能會(huì)出現(xiàn)的問題忧额。對(duì)于這類異常就需要我們?cè)陂_發(fā)的時(shí)候盡量的把業(yè)務(wù)邏輯可能會(huì)出現(xiàn)的問題考慮清楚厘肮,進(jìn)行異常捕捉。
常用的方法包括:try{}catch(Exception e){}finally{}和throws兩種辦法睦番。try{}catch(Exception e){}finally{}是在方法中對(duì)異常進(jìn)行捕獲类茂,catch可以寫多個(gè),Java運(yùn)行時(shí)系統(tǒng)從上到下分別對(duì)每個(gè)catch語(yǔ)句處理的例外類型進(jìn)行檢測(cè)托嚣,直到找到類型相匹配的catch語(yǔ)句為止巩检。(具體的就不過(guò)多贅述)throws是出現(xiàn)在方法頭部,個(gè)人理解算是在最外層拋出異常示启。關(guān)于對(duì)運(yùn)行時(shí)異常的處理兢哭,詳情可以看這篇文章http://blog.csdn.net/zhuangzhineng/article/details/4000821,里面講的格外詳細(xì)夫嗓,這里就不過(guò)多贅述迟螺。
非運(yùn)行時(shí)異常中我們常遇到的可能有IOException、SQLException等舍咖,這類異常就是我們編寫的代碼矩父、sql語(yǔ)句的問題了,這就需要我們回到代碼中仔細(xì)檢查了排霉。