在理想狀況下,程序總會運行在很完美的環境中,網絡不會終端,文件必定存在,程序不會有 BUG。可是,理想很豐滿,現實很骨幹,實際生產環境中,網絡可能會中斷,文件可能會找不到,內存可能會溢出,程序可能會有 BUG。而這些意料以外的狀況就是異常。java
在未處理的狀況下,異常會致使程序沒法繼續執行,從而影響軟件總體的功能,但這是多數狀況下不容許的,因此咱們須要在程序中將可處理的異常處理掉,至少保證當前任務能夠安全退出。安全
Java 異常體系中,Throwable 爲超類,其子類包括 Error 和 Exception 兩類,Error 主要包括 JVM 自己的問題,這一類問題不多出現且沒法被程序所解決,因此代碼中能夠不考慮此部分。網絡
Java 異常體系將異常分爲檢查異常(checked exception)和未檢查異常(unchecked exception)。日誌
未檢查異常也可叫作運行時異常,由於其在 Java 異常體系中僅包含 RuntimeException,主要包括代碼編寫時人爲由於作成的異常,而這些異常在代碼編譯階段沒法發現,常見的有 IndexOutOfBoundsException、NullPointerException 和 IndexOutOfBoundsException 等,當出現未檢查異常時可肯定是代碼 BUG。code
檢查異常包括除 RuntimeException 之外的全部異常,常見的主要爲 IOException 和 SQLExcetion 兩類,此部分異常雖然可能爲人爲形成,但在代碼編譯階段就能夠被編譯器發現,因此須要在代碼中作好相應的處理。繼承
對應異常體系,Java 提供了異常處理機制,經常使用的關鍵字有 try、catch、finally、throw 和 throws。內存
try、catch 和 finally 的用法比較簡單,只須要符合標準語法便可,try 對代碼塊進行監聽,當出現異常時 catch 捕獲異常進行異常處理,最後執行 finally 代碼塊。須要注意幾個點:資源
try{ // 代碼塊 } catch (異常){ // 異常處理代碼 } finally { // 須要確保必定執行的代碼,例如關閉流資源佔用的代碼 }
throw 和 throws 比較容易混淆。throw 用於在代碼中手動拋出異常,而 throws 則用於在方法簽名後聲明須要拋出的異常,涉及到繼承關係時,子類方法拋出異常時,父類方法必須拋出異常,不能爲子類異常的子類且數量不能少於子類,代碼結構以下:編譯器
public void testMethod() throw Exception{ throw new RuntimeException(); }