1. 程式人生 > >異常處理總結

異常處理總結

一、異常概述:

    程式在執行過程中,並不一定會按照程式開發人員預想的步驟來執行,因為實際情況千變萬化,可能會出現各種各樣不可預測的情況,例如使用者輸入了錯誤的資料、程式要開啟的檔案並不存在、程式需要訪問網路中的某個資源時網路卻不通暢等。這些情況出現時,如果沒有處理好,就會導致程式出錯或崩潰。因此,這些可預見的情況必須得到正確的處理,也就是要使用異常處理機制,以保證程式的穩定性和健壯性。

二、異常類的層次結構

在程式的執行過程中,可能會出現各種各樣的異常情況,java語言用不同的異常類物件來表示它們,如下圖是java語言中提供的異常類層次結構。

為了方便對Java程式中出現的異常情況的管理,Java SE API專門設計了java.lang.Throwable類,只有該類的子物件才可以在系統的異常傳播體系中進行傳遞,該類有兩個重要的子類,分別是:Error類和Exception類。

三、異常處理的情況

1.數學運算異常( java.lang.arithmeticexception)

程式中出現了除以零這樣的運算就會出這樣的異常,對這種異常,大家就要好好檢查一下自己程式中涉及到數學運算的地方,公式是不是有不妥了。

2.陣列下標越界(java.lang.arrayindexoutofboundsexception

程式中大多都有對陣列的操作,因此在呼叫陣列的時候一定要認真檢查,看自己呼叫的下標是不是超出了陣列的範圍,一般來說,顯示(即直接用常數當下標)呼叫不太容易出這樣的錯,但隱式(即用變量表示下標)呼叫就經常出錯了,還有一種情況,是程式中定義的陣列的長度是通過某些特定方法決定的,不是事先宣告的,這個時候,最好先檢視一下陣列的length,以免出現這個異常。

3.記憶體溢位異常(java.lang.OutOfMemoryError

記憶體溢位分為Java堆溢位 、虛擬機器棧和本地方法棧溢位 、方法區和執行常量池溢位、本機直接記憶體溢位

1.Java堆溢位 heap space: 
Java堆溢位是因為Java堆容量不足導致的,可以通過設定虛擬機器引數-Xms和-Xmx分別設定Java堆的最小容量和最大容量。

public class RuntimeConstantPoolOOM { 
public static void main(String[] args) { 
List list = new ArrayList (); 
int i=0; 
while(true){ 
list.add(String.valueOf(i++).intern()); 
//會產生java.lang.OutOfMemoryError:PermGen space 


2.永久代容量不足 PermGen space: 
永久代是記錄常量,靜態變數,類資訊等,常見使用String.intern()方法導致常量過多;還有一種情況是使用CGlib動態建立類的代理過多,也會導致類資訊膨脹;還有一種是Java Web中,Jsp檔案過多導致,因為JSP其實也是一個Java類,可通過設定虛擬機器引數-XX:PermSize和-XX:MaxPermSize分別設定永久代的最小容量和最大容量。 
3,本級直接記憶體溢位DirectMemory: 
通常是作業系統記憶體不足的情況下,Java應用程式還向作業系統申請本地記憶體導致,可通過設定-XX:MaxDirectMemorySize設定Java虛擬機器可申請本地記憶體的最大容量。 
4,建立執行緒過多(unable to create new native thread):由於每個執行緒都會分配一定的棧空間,申請執行緒過多,會導致棧空間不足,從而導致棧溢位,但Java虛擬機器丟擲異常資訊的是 “java.lang.OutOfMemoryError:unable to create new native thread”這個異常在Windows系統上可能執行很久都不會丟擲,而是會導致系統假死

4.程式遇上空指標(java.lang.nullpointerexception

呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出現空指標,很多情況下是一些剛開始學習程式設計的朋友常犯的錯誤,即把陣列的初始化和陣列元素的初始化混淆起來了。陣列的初始化是對陣列分配需要的空間,而初始化後的陣列,其中的元素並沒有例項化,依然是空的,所以還需要對每個要進行呼叫的元素都進行初始化

5.指定的類不存在(java.lang.classnotfoundexception

這個異常是很多原本在jb等開發環境中開發的程式設計師,把jb下的程式包放在wtk下編譯經常出現的問題,這裡主要考慮一下類的名稱和路徑是否正確即可,如果是在jb下做的程式包,一般都是預設加上package的,所以轉到wtk下後要注意把package的路徑加上

6.方法引數錯誤(java.lang.illegalaccessexception

很多j2me的類庫中的方法在一些情況下都會引發這樣的錯誤,比如音量調節方法中的音量引數如果寫成負數就會出現這個異常,再比如g.setcolor(int red,int green,int blue)這個方法中的三個值,如果有超過255的也會出現這個異常,因此一旦發現這個異常,我們要做的,就是趕緊去檢查一下方法呼叫中的引數傳遞是不是出現了錯誤。

7.沒有訪問許可權(java.lang.illegalaccessexception

當應用程式要呼叫一個類,但當前的方法即沒有對該類的訪問許可權便會出現這個異常。對程式中用了package的情況下要注意這個異常。

8.錯誤(java.lang.Error

錯誤,是所有錯誤的基類,用於標識嚴重的程式執行問題,這些問題通常描述一些不應該被應用程式捕獲的反常情況。

原因:對系統所訪問外部資源,未執行關閉操作,導致外部資源大量浪費,最終可能導致系統無法正常執行;對系統所訪問的外部資源關閉次數太多,外部系統無法正常處理;系統訪問的外部資源出現異常情況。

解決方法:訪問外部資源之前,首先檢查該資源(如資料庫)是否可正常連線或操作;訪問外部資源時,如果進行了連線,一定要關閉操作,並且僅進行一次關閉操作;儘量在同一操作中共享外部資源,以減少該操作對資源的浪費,提高程式的執行效率。

例如初始化程式錯誤、違法訪問錯誤、不相容的類變化錯誤、例項化錯誤、內部錯誤、連結錯誤、未找到類定義錯誤、域不存在錯誤、方法不存在錯誤等等。