『黑馬程序員』---java--異常Exception機制

異常處理是程序中不可缺少的一個環節.首先從異常的概述最終再到自定義異常處理.

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------


異常:程序在運行時出現不正常情況

例如算數異常:


編譯通過,但當不小心把除數錄入爲0時,就會導致如下異常。

該異常違反了數學計算規範,除數不能爲0。


異常的由來:

問題也是現實生活中一個具體的實物,也可以通過java類的形式進行描述,並封裝成對象。

其實就是java對不正常情況進行描述後的對象體現。


對與問題的劃分:

1.嚴重error (超出JVM範圍,一般不編寫代碼對其進行處理,例如內存溢出)不治之症

2.非嚴重exception(在JVM範圍內,可以挽救,例如:數組下標越界,空指針)頭疼腦熱

 

因爲以上兩種問題,都用共性內容例如:不正常情況的信息,引發原因等。所以,java對其向上抽取得到了他們的爸爸Throwable(所有錯誤或異常的超類)

 

異常的處理代碼格式

1,try和catch

2,try和finally 

3,try和catch和finally


Java提供特有的語句進行處理

Try{

//需要被檢測的代碼

}catch(Exception e){

//處理方式,例如:

e.printstacktrace();//異常名稱,異常信息,異常出現的位置(JVM默認異常處理機制)

}finally{

//一定會執行的,通常用於關閉資源

}

注意:爲了提高安全性,可提前在函數上聲名異常,這樣會強行讓調用處進行處理,要麼捕捉,要麼拋出,否則編譯就會失敗,例如:

int div(int  a, int  b)throws  Exception

{

         returna/b;

}


對多異常的處理.

1,聲明異常時,建議聲明更具體的異常,具體到Exception的子類.這樣處理的可以更具體.

2,對方聲明幾個異常,就要對應有幾個catch快,不要定義多餘的catch快.如果多個catch快中的異常出現繼承關係,父類異常catch快放在最下面.否則子類異常都進不去.

建議在進行catch處理時,catch中一定要定義具體處理方式

 

異常在子父類覆蓋中的體現[原則,父類能解決的範圍內拋出]

1,子類在覆蓋父類時,如果父類的方法拋出異常,那麼子類的覆蓋方法,只能拋出父類的異常或者該異常的子類.或者不拋自行try解決.

2,如果父類方法拋出多個異常,那麼子類覆蓋父類時,只能拋出父類異常的子集

3,如果父類或接口的方法中沒有異常拋出,那麼子類在覆蓋方法時也不能拋出異常

         如果子類方法發生了異常,就必須要自行try處理,絕對不能拋,因爲父類解決不了


Exception中有一個特殊的子類異常:RuntimeException運行時異常。
 如果在函數內容上拋出該異常,函數可以不用聲明,編譯可以通過.(他不需要調用者處理)
當該異常發生,必要程序停止。因爲在運行時,出現了無法繼續運算的情況,要停止程序後,對代碼進行修改。


自定義異常:

按照java的面向對象思想,將程序中出現的特有問題進行封裝

定義類繼承Exception或者RuntimeException

1,爲了讓該自定義類具備可拋性

2,讓該類具備操作異常的共性方法

當要定義自定義異常的信息時,可以使用父類已經定義好的功能.

將異常信息傳遞給父類的構造函數(下面有實例)


自定義異常時:如果異常發生,無法再繼續進行運算,
就讓自定義異常繼承RuntimeException。

例子:

class NoValueException extends RuntimeException{//自定義異常,繼承RuntimeException
	NoValueException(String message){
		super(message);
	}
}
interface Shape{//定義形狀接口,內部有獲取面積功能
	void getArea();
}
class Rec implements Shape{//實現Shape接口
	private int len,wid;
	Rec(int len,int wid){
		if(len<=0||wid<=0)//判斷拋出條件
			throw new NoValueException("出現非法值");//用throw關鍵字拋出自定義異常
		this.len=len;
		this.wid=wid;
	}
	public void getArea(){//複寫接口中的方法
		System.out.println(len*wid);
	}
}
public class Exception{
	public static void main(String[] args) {
		Rec r=new Rec(-3,3);//實驗,編譯不通過.直接停掉.
		r.getArea();
	}
	
}

異常的好處:

1,將問題進行封裝

2,將正常流程代碼和問題處理代碼相分離,方便於閱讀.


異常的處理原則:

1,處理方式有兩種:try或者throws

2,調用到拋出異常的功能時,拋出幾個,就處理幾個,一個try對應一個catch

3,多個catch,父類的catch快放到最下面

4,catch內,需要定義針對性處理方式,不要簡單的定義一些輸出語句

 

發佈了30 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章