Java中常用的異常處理情況及關於開發中異常處理的建議
本周四老師由一個簡單程序將問題引出,講授了Java中異常處理的情況。根據課件內容及上網查閱資料,將關於JAVA項目中的常用的異常處理情況總結如下:
首先什麽是異常(Exception):發生於程序執行期間,表明出現了一個非法的運行狀況。許多JDK中的方法在檢測到非法情況時,都會拋出一個異常對象。異常處理的目的是依據實際情況提供不同的錯誤應對策略與手段,使程序更穩定,更安全。異常處理的主要用途是提供準確的錯誤消息,解釋失敗的原因、位置和錯誤類型等,同時提供一定的恢復能力,盡可能地保證數據完整性不被破壞,並讓程序能繼續運行。
Java中有許多內置異常類:定義了一些異常類在 java.lang 標準包中。標準運行時異常類的子類是最常見的異常類。由於
ArithmeticExceptio當出現異常的運算條件時,拋出此異常。例如,一個整數"除以零"時,拋出此類的一個實例。
ArrayIndexOutOfBoundsException 用非法索引訪問數組時拋出的異常。如果索引為負或大於等於數組大小,則該索引為非法索引。
ArrayStoreException試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常。
ClassCastException 當試圖將對象強制轉換為不是實例的子類時,拋出該異常。
IllegalArgumentException拋出的異常表明向方法傳遞了一個不合法或不正確的參數。
IllegalMonitorStateException 拋出的異常表明某一線程已經試圖等待對象的監視器,或者試圖通知其他正在等待對象的監視器而本身沒有指定監視器的線程。
IllegalStateException在非法或不適當的時間調用方法時產生的信號。換句話說,即 Java 環境或 Java 應用程序沒有處於請求操作所要求的適當狀態下。
IllegalThreadStateException線程沒有處於請求操作所要求的適當狀態時拋出的異常。
IndexOutOfBoundsException 指示某排序索引(例如對數組、字符串或向量的排序)超出範圍時拋出。
NegativeArraySizeException如果應用程序試圖創建大小為負的數組,則拋出該異常。
NullPointerException當應用程序試圖在需要對象的地方使用 null 時,拋出該異常
NumberFormatException當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。
SecurityException由安全管理器拋出的異常,指示存在安全侵犯。
StringIndexOutOfBoundsException此異常由 String 方法拋出,指示索引或者為負,或者超出字符串的大小。
UnsupportedOperationException當不支持請求的操作時,拋出該異常。
下面的表中列出了 Java 定義在 java.lang包中的檢查性異常類。
ClassNotFoundException應用程序試圖加載類時,找不到相應的類,拋出該異常。
CloneNotSupportedException當調用 Object 類中的 clone 方法克隆對象,但該對象的類無法實現 Cloneable 接口時,拋出該異常。
IllegalAccessException拒絕訪問一個類的時候,拋出該異常。
InstantiationException當試圖使用 Class 類中的 newInstance 方法創建一個類的實例,而指定的類對象因為是一個接口或是一個抽象類而無法實例化時,拋出該異常。
InterruptedException一個線程被另一個線程中斷,拋出該異常。
NoSuchFieldException請求的變量不存在
NoSuchMethodException請求的方法不存在
java.lang.OutOfMemoryError這個錯誤每個人都會遇到,產生該錯誤的原因大都出於以下原因:JVM內存過小、程序不嚴密,產生了過多的垃圾。
導致OutOfMemoryError異常的常見原因有以下幾種:
內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
代碼中存在死循環或循環產生過多重復的對象實體;
使用的第三方軟件中的BUG;
啟動參數內存值設定的過小;
此錯誤常見的錯誤提示:
tomcat:java.lang.OutOfMemoryError: PermGen space
tomcat:java.lang.OutOfMemoryError: Java heap space
weblogic:Root cause of ServletException java.lang.OutOfMemoryError
resin:java.lang.OutOfMemoryError
java:java.lang.OutOfMemoryError
解決java.lang.OutOfMemoryError的方法有如下幾種:
增加jvm的內存大小。方法有: 1)在執行某個class文件時候,可以使用java -Xmx256M aa.class來設置運行aa.class時jvm所允許占用的最大內存為256M。 2)對tomcat容器,可以在啟動時對jvm設置內存限度。對tomcat,可以在catalina.bat中添加:3)對resin容器,同樣可以在啟動時對jvm設置內存限度。在bin文件夾下創建一個startup.bat文件。其次優化程序,釋放垃圾。主要包括避免死循環,應該及時釋放種資源:內存, 數據庫的各種連接,防止一次載入太多的數據。導致java.lang.OutOfMemoryError的根本原因是程序不健壯。因此,從根本上解決Java內存溢出的唯一方法就是修改程序,及時地釋放沒用的對象,釋放內存空間。
所以在遇到異常處理情況時應從以下建議考慮:
1:在中間層組件中拋出異常,在界面層組件中捕獲異常在底層組件中捕獲JVM拋出的“只有程序員能看懂的”異常,轉換為中間層的業務邏輯異常,再由界面層捕獲以提供有意義的信息。
2:自身能夠處理的異常,不要再向外界拋出。
3:盡可能地在靠近異常發生的地方捕獲並處理異常。
4:盡可能地捕獲最具體的異常類型,不要在中間層用 catch(Exception)“吃掉”所有異常
5:在開發階段捕獲並顯示所有異常信息,發布階段要移除部分代碼,以避免“過於專業”的異常信息困擾用戶,特別地,系統發布之後,不要將服務端異常的詳細信息發給客戶端,以免被黑客利用
Java中常用的異常處理情況及關於開發中異常處理的建議