1. 程式人生 > >對比Exception和Error,執行時異常和一般異常

對比Exception和Error,執行時異常和一般異常

為什麼要處理異常?

程式中一旦遇到異常就會結束程,異常之後的程式就不會執行了,並將錯誤報告給使用者。eg:int i=1/0;就會產生異常。所以要保證程式能正常執行,就必須處理異常。

	public static void main(String[] args) {
		System.out.println("start");
		int i=1;
		int j=1;
		int temp=i/j;
		System.out.println("finish");
	}

Exception,Error都是繼承了Throwable類,在java中只有Throwable的例項才可以被丟擲或捕獲。

Exception是指程式正常執行時,可以預料的意外情況,可能並且應該被捕獲,進行相應處理。

Error是指在正常情況下不大可能出現的情況,大部分的Error都會導致程式處於非正常,不可恢復狀態,既然是非正常情況,所以不便於也不需要捕獲,eg:OutOfMemoryError,這是Error的子類。

java中異常分為兩類:checked exception(檢查異常)和unchecked exception(未檢查異常),對於未檢查異常也叫RuntimeException(執行時異常).

常見執行時異常

對於unchecked exception:可以不處理,因為不可控eg:Error

對於checked exception:必須進行處理,捕獲或丟擲。

=====================================================================================

1:assert:斷言,在實際開發中並不常見。

2:throw and throws,

              #throw:丟擲異常物件

             #throws:在方法宣告處使用,表示此方法不處理異常,交給呼叫此方法呼叫處處理,有throws,呼叫時需要處理異常,或繼續丟擲

class Math{
	public int div(int i,int j) throws Exception{	// 定義除法操作,如果有異常,則交給被呼叫處處理
		System.out.println("***** 計算開始 *****") ;
		int temp = 0 ;	// 定義區域性變數
		try{
			temp = i / j ;	// 計算,但是此處有可能出現異常
		}catch(Exception e){
			throw e ;
		}finally{	// 不管是否有異常,都要執行統一出口
			System.out.println("***** 計算結束 *****") ;
		}
		return temp ;
	}
};
public class ThrowDemo02{
	public static void main(String args[]){
		Math m = new Math() ;
		try{
			System.out.println("除法操作:" + m.div(10,0)) ;
		}catch(Exception e){
			System.out.println("異常產生:" + e) ;
		}
	}
};

3:Exception的異常必須處理,而RuntimeException的異常不處理的(但是最好處理)

     在開發中,try catch finally throw throws,是經常在一起使用的,eg:現在要設計一個相除的方法,但是在進行操作之前必須列印“*********計算開始**********”的資訊,結束後列印“**********計算結束*******”的資訊,如果有異常,則把異常交給呼叫處處理。程式碼如上面所示。

4:如果需要自定義異常,則直接繼承Exception類即可。

class MyException extends Exception{	// 自定義異常類,繼承Exception類
	public MyException(String msg){
		super(msg) ;	// 呼叫Exception類中有一個引數的構造方法,傳遞錯誤資訊
	}
};
public class DefaultException{	
	public static void main(String args[]){
		try{
			throw new MyException("自定義異常。") ;	 // 丟擲異常
		}catch(Exception e){
			System.out.println(e) ;
		}
	}
}

常見的幾種RuntimeException如下:

NullPointerException - 空指標引用異常
ClassCastException - 型別強制轉換異常。
IllegalArgumentException - 傳遞非法引數異常。
ArithmeticException - 算術運算異常
ArrayStoreException - 向陣列中存放與宣告型別不相容物件異常
IndexOutOfBoundsException - 下標越界異常
NegativeArraySizeException - 建立一個大小為負數的陣列錯誤異常
NumberFormatException - 數字格式異常
SecurityException - 安全異常
UnsupportedOperationException - 不支援的操作異常

NoClassDefFoundError錯誤發生的原因

NoClassDefFoundError錯誤的發生,是因為Java虛擬機器在編譯時能找到合適的類,而在執行時不能找到合適的類導致的錯誤。例如在執行時我們想呼叫某個類的方法或者訪問這個類的靜態成員的時候,發現這個類不可用,此時Java虛擬機器就會丟擲NoClassDefFoundError錯誤。與ClassNotFoundException的不同在於,這個錯誤發生只在執行時需要載入對應的類不成功,而不是編譯時發生。很多Java開發者很容易在這裡把這兩個錯誤搞混。

簡單總結就是,NoClassDefFoundError發生在編譯時對應的類可用,而執行時在Java的classpath路徑中,對應的類不可用導致的錯誤。

NoClassDefFoundError和ClassNotFoundException區別

我們經常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError這兩個錯誤迷惑不清,儘管他們都與Java classpath有關,但是他們完全不同。NoClassDefFoundError發生在JVM在動態執行時,根據你提供的類名,在classpath中找到對應的類進行載入,但當它找不到這個類時,就發生了java.lang.NoClassDefFoundError的錯誤,而ClassNotFoundException是在編譯的時候在classpath中找不到對應的類而發生的錯誤。ClassNotFoundException比NoClassDefFoundError容易解決,是因為在編譯時我們就知道錯誤發生,並且完全是由於環境的問題導致。而如果你在J2EE的環境下工作,並且得到NoClassDefFoundError的異常,而且對應的錯誤的類是確實存在的,這說明這個類對於類載入器來說,可能是不可見的。