黑馬程序員------面向對象(No.8)(自定義異常、throw(throws)、RuntimeException、覆蓋時異常、異常總結)

---------------------- ASP.Net+Android+IO開發S.Net培訓、期待與您交流! ---------------------- 

微笑自定義異常

因爲項目中會出現特有的問題。而這些問題並未被java所描述並封裝對象。所以對這些特有的問題可以按照java的對問題的封裝的思想,將特有的問題,進行自定義異常封裝

 

當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作。

要麼在內部try-catch處理。
要麼在函數上聲明讓調用者處理

 

一般情況下,函數內出現異常,函數上需要聲明。發現打印的結果中只有異常的名稱,卻沒有異常的信息。因爲自定義異常並未定義信息。

 

如何定義異常信息?
因爲父類中已經把異常信息的操作都完成了。
所以父類只要在構造時,將異常信息傳遞給父類通過super語句;
那麼就可以直接通過getMessage方法獲取自定義的異常信息。

 

自定義異常要求:
必須是自定義類繼承Exception。

 

繼承Exception原因:
異常體系有一個特點:因爲異常類和異常對象都被拋出。他們都具有可拋性,

這個可拋性是Throwable這個體系中獨有特點。

只有這個體系中的類和對象纔可以被throws和throw操作。

/*
需求:在本程序中,對於除數是-1,也視爲是錯誤的是無法進行運算的,
那麼就要對這個問題進行自定義描述。
*/

//自定義異常:必須是自定義類繼承Exception。
//自定義異常類要定義信息。否則會發現打印的結果中只有異常的名稱,沒有異常的信息。
class FuShuException extends Exception{
	private int num;
	//因爲父類中已經把異常信息的操作都完成了。
	//所以父類只要在構造時,將異常信息傳遞給父類通過super語句,
	//那麼就可以直接通過getMessage方法獲取自定義的異常信息。
	FuShuException(String msg,int num){
		super(msg);
		this.num = num;
	}
	public int getValue(){
		return num;
	}
}
class Demo{
	//一般情況下,函數內出現異常,函數上需要聲明。

	//當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作。
	//要麼在內部try-catch處理。
	//要麼在函數上聲明讓調用者處理
	int div(int a,int b)throws FuShuException{
		if(b<0){
			//手動通過throw關鍵字拋出一個自定義異常對象
			throw new FuShuException("這裏出現負數異常",b);
		}
		return a/b;
	}
}
class ExceptionDemo{
	public static void main(String[] args){ 
		Demo d = new Demo();
			try{
			int x = d.div(5,-1);
			System.out.println(x);
			}catch(FuShuException e){
				System.out.println(e.getMessage()+" "+e.getValue());
			}
		System.out.println("over");
	}
}

運行結果:



微笑throws和throw的區別

1.thows用在函數上   後面跟異常類,可以跟多個,用逗號分開

2.throw用在函數內   後面跟的是異常對象。

 

微笑RuntimeException

Exception 中有一個特殊的子類異常RuntimeException運行時異常

1.如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過。

2.如果在函數上聲明瞭該異常,調用者可以不用進行處理,編譯一樣通過。

之所以不用在函數上聲明,是因爲,不需要讓調用者處理,當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,希望進製程序後,對代碼進行修正。

 

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

 

對於異常分兩種

1.編譯時被檢測的異常。一定要在方法上聲明,一定要對其進行處理。有兩種方式。

2.編譯時不被檢測的異常。(運行時異常,RuntimeException以及其子類)不用在方法上聲明,也不用處理

//如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過。
//如果在函數上聲明瞭該異常,調用者可以不用進行處理,編譯一樣通過。
class FuShuException extends RuntimeException{
	private int num;
	FuShuException(String msg,int num){
		super(msg);
		this.num = num;
	}
	public int getValue(){
		return num;
	}
}
class Demo{
	//RuntimeException的子類異常可以不用聲明 throws FuShuException
	//非RuntimeException異常一定要聲明throws FuShuException,否則不能編譯通過。
	int div(int a,int b){
		if(b<0){
		throw new FuShuException("這裏出現負數異常",b);
		}
		return a/b;
	}
}
class ExceptionDemo{
	public static void main(String[] args){ 
		Demo d = new Demo();
		int x = d.div(5,-1);
		System.out.println(x);
		System.out.println("over");
	}
}

微笑finally

finally代碼塊:定義一定執行的代碼

通常用於關閉資源,或者一定要執行一次的代碼。

//finally代碼塊:定義一定執行的代碼
//通常用於關閉資源,或者一定要執行一次的代碼。
class FuShuException extends Exception{
	FuShuException(String msg){
		super(msg);
	}
}
class Demo{
		int div(int a,int b)throws FuShuException{
		if(b<0){
		throw new FuShuException("這裏出現負數異常");
		}
		return a/b;
	}
}
class ExceptionDemo{
	public static void main(String[] args){ 
		Demo d = new Demo();
		try
		{
			int x = d.div(4,-1);
			System.out.println(x);
		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			//return;
		}finally{
			System.out.println("finally");//finally中放的是一定要執行的代碼
		}
		System.out.println("OVER");
	}
}

 

小例子

記住一點:catch是用於處理異常。如果沒有catch就代表異常類沒有被處理過,如果該異常是檢測時異常。那麼必須聲明。

/*
public void method(){ //這裏不需要聲明 throws Exception 也能編譯通過
	try
	{
		throw new Exception();
	}
	catch (Exception e)
	{
		語句
	}
}
*/
/*
public void method() throws Exception{ //這裏要聲明(除非RuntimeException) throws Exception 不然不能編譯通過
	try
	{
		throw new Exception();
	}
	finally
	{
		關閉資源語句
	}
}
*/


微笑異常覆蓋時的異常特點

 

異常在子父類覆蓋中的體現:

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

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

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

4.如果子類的方法發生了異常,就必須用try-catch處理。絕對不能拋出!

class AException extends Exception{
}
class BException extends Exception{
}
class CException{
}
/*
Exception
   |--AException
      |--BException
   |--CException
*/
class Fu{
	public show() throws AException{
	}
}
class Zi{
	//public show() throws AException{}
	//public show() throws BException{}
	/*public show(){
		try{}
		catch (...){處理語句}AException、BException、CException都可以在內部被處理,就不用拋出了~
	}*/
}

 

微笑附加吧:

 

異常的好處

1.將問題進行封裝。

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

 

異常的處理原則:

1.兩種方式:try或者拋出

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

3.多個catch,父類的catch放在下面。

4.catch內需要定義針對性的處理方式。不要太簡單的定義printStackTrace,輸出語句;也不要不寫。

    當捕獲的異常本功能處理不了時,可以繼續在catch中拋出。

try
{
	throw new AException();
}
catch (AException e)
{
	throw e;
}

      如果該異常類處理不了,但並不屬於該功能出現的異常。可以將該異常轉換後,再拋出和該功能相關的異常。

  或者異常可以處理,當需要將異常產生的和本類功能相關的問題提供出去,讓調用者知道並處理,也可以將捕獲異常處理後轉換新的異常

try
{
	throw new AException();
}
catch (AException e)
{
	//對AException進行處理
	throw new BException;
}

練習題 請參閱  傳智播客畢向東Java基礎視頻教程-day10-06-面向對象(練習四).avi
 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ---------------------- 

詳情請查看:http://edu.csdn.net

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章