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