每日一題:Java異常處理

什麼是異常

在理想狀況下,程序總會運行在很完美的環境中,網絡不會終端,文件必定存在,程序不會有 BUG。可是,理想很豐滿,現實很骨幹,實際生產環境中,網絡可能會中斷,文件可能會找不到,內存可能會溢出,程序可能會有 BUG。而這些意料以外的狀況就是異常。java

在未處理的狀況下,異常會致使程序沒法繼續執行,從而影響軟件總體的功能,但這是多數狀況下不容許的,因此咱們須要在程序中將可處理的異常處理掉,至少保證當前任務能夠安全退出。安全

Java 異常

Java 異常體系中,Throwable 爲超類,其子類包括 Error 和 Exception 兩類,Error 主要包括 JVM 自己的問題,這一類問題不多出現且沒法被程序所解決,因此代碼中能夠不考慮此部分。網絡

Java 異常體系將異常分爲檢查異常(checked exception)和未檢查異常(unchecked exception)。日誌

未檢查異常也可叫作運行時異常,由於其在 Java 異常體系中僅包含 RuntimeException,主要包括代碼編寫時人爲由於作成的異常,而這些異常在代碼編譯階段沒法發現,常見的有 IndexOutOfBoundsException、NullPointerException 和 IndexOutOfBoundsException 等,當出現未檢查異常時可肯定是代碼 BUG。code

檢查異常包括除 RuntimeException 之外的全部異常,常見的主要爲 IOException 和 SQLExcetion 兩類,此部分異常雖然可能爲人爲形成,但在代碼編譯階段就能夠被編譯器發現,因此須要在代碼中作好相應的處理。繼承

Java 異常處理

對應異常體系,Java 提供了異常處理機制,經常使用的關鍵字有 try、catch、finally、throw 和 throws。內存

try、catch 和 finally 的用法比較簡單,只須要符合標準語法便可,try 對代碼塊進行監聽,當出現異常時 catch 捕獲異常進行異常處理,最後執行 finally 代碼塊。須要注意幾個點:資源

  • 是不管是否出現異常,finally 代碼塊是必定執行,且在最後執行
  • catch 能夠出現屢次,但出現屢次時須要注意異常的父子級關係,後面的異常不能爲前面的子類
try{
    // 代碼塊
} catch (異常){
    // 異常處理代碼
} finally {
    // 須要確保必定執行的代碼,例如關閉流資源佔用的代碼
}

throw 和 throws 比較容易混淆。throw 用於在代碼中手動拋出異常,而 throws 則用於在方法簽名後聲明須要拋出的異常,涉及到繼承關係時,子類方法拋出異常時,父類方法必須拋出異常,不能爲子類異常的子類且數量不能少於子類,代碼結構以下:編譯器

public void testMethod() throw Exception{
    throw new RuntimeException();
}

Java 異常的使用建議

  • 僅當有須要或者能處理時對異常進行捕獲,不然將異常拋向調用者,直至到與頁面進行交互時統一處理或記錄日誌
  • finally 代碼塊建議只用來釋放佔用的資源,不要用來處理業務邏輯
  • 不要經過異常處理機制處理 RuntimeException,由於此類異常能夠經過修改代碼來解決,同時增長程序的健壯性
  • 異常處理記錄日誌時記錄對問題排查有用的信息,沒法肯定時則將異常堆棧信息及方法運行參數記錄下來
  • catch 捕獲異常時粒度儘量,例如捕獲 FileNotFoundException 時不要用 IOException 代替
  • try 監聽的代碼儘量少,不要將整個方法體都放在 try 語句中
相關文章
相關標籤/搜索