一.概述
異常是程序運行過程中出現的錯誤。是Java語言健壯性的一個重要體現。
Java把異常當作對象來處理,並定義一個基類java.lang.Throwable作爲所有異常的超類。 在Java API中已經定義了許多異常類,這些異常類分爲兩大類,錯誤Error和異常Exception。
Error是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath等。這些異常發生時, Java虛擬機(JVM)一般會選擇線程終止。
Exception是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。 程序中應當儘可能去處理這些異常。
二.兩種異常
實際編程中,都是圍繞着兩種異常展開的。
1.RuntimeException
運行時異常,略奇怪的是,它是Exception的子類,但作用和捕獲的機制完全不同。注意:這正是java異常機制的模糊地帶,也是使用好java異常的關鍵。
RuntimeException是爲了一些很基礎的異常而出現的。比如,一個人走路,不知何時可能被絆倒。比如,new一個int數組長度爲2,main方法中要求用戶輸入數字,然後把數字複製給數組;如果用戶輸入了3個數字,則出現ArrayOutOfBoundException。
這些異常太基礎、常見,有太多方法的實現都可能導致這些異常。如果像一般Exception一樣強制要求調用者一一捕獲,那麼可想而知,程序中會出現大量冗餘代碼。
於是,RuntimeException可以不強制捕獲(但建議捕獲一些)。一旦觸發這些異常,程序將直接退出運行。
2.一般Exception
也叫checkedException。特點是必須被捕獲或傳輸(throws到調用者)。總結有兩個功能:
a.避免異常被忽視,增強程序查錯能力。這也是java異常機制的核心:在編碼階段就儘可能地對出現的錯誤進行預處理,而最主要的處理方式可能就是日誌記錄了,當然返回給用戶一個相對有好的錯誤頁面也是主要原因。
b.編程的一部分。也就是在catch{......}中不再是日誌記錄或打印,而是業務邏輯代碼。這更像是一種編程技巧,把被拋出的自定義異常,相當於“返回值”,調用者catch這個自定義的異常,然後做業務邏輯處理。
比如,用戶註冊模塊,持久層方法發現用戶名已經被使用,throw new MyException,(當然方法體throws MyException),控制器層方法catch這個異常,重繪登陸頁面,讓用戶重新輸入。這個情況很常見,一般的方法是if判斷,返回一個boolean值或int標記值;但這裏用自定義異常,可以實現同樣的功能。這有一點好處是,代碼的可讀性會略高一些,基本可以忽略不計。
三.異常處理語法
Java異常的捕獲和處理是一個不容易把握的事情,如果處理不當,不但會讓程序代碼的可讀性大大降低,
而且導致系統性能低下,甚至引發一些難以發現的錯誤。
Java異常處理涉及到五個關鍵字,分別是:try、catch、finally、throw、throws。
......
(略)