Java 中的Exception 有什麼用?

Exception 的做用,這個問題是一個開放性的問題,沒有標準的答案,不一樣經歷的人可能會有不一樣的答案,後續的陳述這表明我我的的意見,不必定正確,但有必定的參考性。程序員

  1. Exception,顧名思義,表明着程序運行的過程當中出現一種不正常的狀態,須要停止運行,同時又能快速的發現程序爲何會出現錯,經過異常的信息可以快速定位,因此異常要儘量多的提供瞬時的狀態信息,尤爲是應用系統自身拋出的異常,須要將上下文狀態儘量多的輸出,有助於排查和定位。
  2. Exception 也是一種程序邏輯控制的方式,是程序健壯性的一種表現。其實,大都數異常,程序都應該有必定的相應的處理邏輯,例如:ArrayIndexOutOfBoundsException,這類異常在編碼過程當中應該可以預見,並須要作出現相應的邏輯控制,有經驗的程序員,在編碼的過程當中就已經考慮到各類異常的狀況,待整個系統上線後,出現的問題相對較少,而普通的程序員每每只保證程序在Happy Case 時可以正常運行,卻忽略了各類異常狀況,每每是在出現問題後進行補救,致使程序在反覆補救後,邏輯混亂,這也就是不少項目早期的代碼質量高,通過一段時間後,代碼慘不忍睹的根源。
  3. 何時須要Cache Exception,何時須要Throw 呢?這也是不會有標準答案的過程,Java 自己也沒有給出標準答案,也沒有指導原則。但通過無數次實踐的經驗後,你就能體會異常的重要性,每每出現很詭異的Bug時,同時可參考的日誌或其它信息時,在關鍵的位置異常被人爲的隱藏是多麼愚蠢的行爲。我在使用一個開源的框架時,時常會發現重要的異常信息被隱藏,致使花費大量的時間去跟蹤代碼。經過上面的描述,也就不難看出,異常在何時須要Throw,何時須要Catch,原則其實很簡單:1)異常在可以徹底掌控的狀況下,並且也有明確的邏輯處理時,須要Catch,同時,也須要關注外部程序是否須要感知異常,若是須要,則封裝新的異常後從新Throw;2)沒法決定處理邏輯的狀況下,須要將全部異常Throw,讓外部程序決定處理邏輯。
  4. 何時定義Exception 一樣是沒有任何指導原則,只能憑自身的經驗判斷,根據我我的的經驗的原則是:1)須要外部程序對異常狀況有明確處理狀況時,須要定義異常,以便外部程序可以明確識別;2)內部程序處理過程當中出現太多異常,而且這類異常具備共同的特性(例如:ClassNotFountException, NoSuchMehtodException 等),不須要外部程序對這類異常分別處理時,須要定義異常。
  5. Exception 和 RuntimeException 有什麼區別,在什麼場景下定義,也是一個仁者見仁,智者見智的問題,Java 沒有任何指導建議,按我我的的判斷不少的定義也不是特別合理,例如:IndexOutOfBoundsException 應該是一個Exception JDK 即定義爲RuntimeExcption 這類錯誤須要明確的提醒外部程序對數組進行邏輯限制,也是應用系統在常常出現錯誤後,才能主動Cache 這類異常;然而像 ClassNotFoundException 這類異常在極少數狀態下才會進行邏輯處理JDK 卻定義爲Exception 致使不少反射類的項目的處理邏輯變得複雜,NullPointerException 也是常常出現的,但定義爲RuntimeException 是合理的,由於JDK 從邏輯根本沒法捕捉NullPointerException,應該是在JVM 執行過程當中纔可以進行邏輯判斷,具體並未研究。通過上面的兩個示例也很容易看出Exception 和RuntimeException 有什麼區別,JDK 的設計應該從外部程序使用的角度進行異常設計,因爲外部程序致使的異常,而且外部程序應當有邏輯處理異常狀態,這類異常理應定義爲Exception,而其它因爲JVM 在編碼期沒法判斷,也沒法從語法層面提供解釋的Exception 應該定義爲RuntimeException。

針對Java 異常的解讀是我我的的看法,就像古詩詞同樣,不一樣人有不一樣的解讀,相信JDK 的設計者也沒法給 Java Exception 一個明確的解釋和原則,只能靠歷史的積累,逐造成相對完整的理解,供後人學習。數組

相關文章
相關標籤/搜索