黑馬程序員_異常

  ------- android培訓java培訓、期待與您交流! ----------


一 異常

1 異常:程序運行時的不正常,java將這些異常封裝成了對象
(1)作用:將問題進行封裝,將正常流程代碼和問題處理代碼相分離
(2)異常分爲兩大體系,Error和Exception,其父類是Throwable。
    其中,Error是嚴重的異常,一般不編寫針對的處理代碼。Exception是非嚴重的異常,可編寫針對性的代碼進行處理。
(3)父類Throwable類中定義的是所有異常的共性方法。
     方法摘要:
     getMessage() 獲取異常信息
     toString() 獲取異常類名和異常信息
     printStackTrace()獲取異常類名和異常信息,以及異常出現在程序中的位置

2 異常的處理
(1)java虛擬機本身有異常處理機制,如果程序發生異常,java虛擬機會拋出異常信息並使程序停止
(2)java提供的處理異常語句

try
{
	需要被檢查的代碼;		
}
catch(異常類 變量)
{
	處理異常的代碼;
}
finally
{
	一定會執行的語句;//一般用於關閉資源
}
(3)還有兩種格式
    try{} catch(){}
    try{} finally{} 


3 throws和throw
(1)throws關鍵字用於在方法上標明該方法可能會發生某類異常
(2)聲明異常時,建議聲明更爲具體的異常,這樣處理的更爲具體
(3)如果調用者調用了在方法上標明throws的方法,調用者必須處理該異常或者在自己所在的函數上聲明異常
(4)throw關鍵字用於在方法內手動拋出異常對象
(5)throw和throws的區別:
         throws定義在函數上,後面跟異常類,可以多個,用於聲明該函數可能發生某類異常。
         throw定義在函數內,後面跟異常對象,用於拋出異常對象。

4 多異常處理
(1)如果方法上聲明瞭多個異常,那麼調用者應該定義多個對應的catch塊
(2)如果多個catch塊存在繼承關係,那麼父類的catch塊放在最下面

下面通過一個例子說明:

class  Demo
{
	public static void main(String[] args) 
	{
		ExceptionDemo ed=new ExceptionDemo();
		try
		{
			//該方法上throws了異常,調用該方法需要處理或在主函數上聲明,這裏用的是try處理
			ed.show(1);
		}
		catch (ArrayIndexOutOfBoundsException e)
		{
			//如果真的發生ArrayIndexOutOfBoundsException異常,會執行該語句.不發生異常該語句不會執行
			System.out.println("角標越界啦");
		}
		catch (ArithmeticException e)
		{
			//如果真的發生ArithmeticException異常,會執行該語句.不發生異常該語句不會執行
			System.out.println("除以0啦");
		}
		catch (Exception e)
		{
			//因爲Exception是他們的父類都能接受,所以應該放在最下面。
			//但是不建議用,因爲這樣的話很容易將問題隱藏掉
			System.out.println("除以0啦");
		}
		finally
		{
			System.out.println("over");//不管有沒有異常發生都會執行
		}
			
	}
}

class ExceptionDemo
{
	//在方法上聲明可能會發生數組角標越界異常和算數運算異常
	public void show(int x) throws ArrayIndexOutOfBoundsException,ArithmeticException
	{

		int[] arr=new int[4];
		System.out.println(arr[3]);
		int y=10/x;		
		System.out.println(y);
	}
}

5 自定義異常
(1)在我們做項目時,當我們所描述的問題java沒有進行封裝時,我們可以將自己的問題進行封裝對象。
(2)自定義異常時,應該繼承Exception或RuntimeException,讓其類繼承java異常體系,具備可拋性以及使用體系的共性方法。
(3)如果方法中出現通過throw拋出的異常時,一般情況下,應當在函數上聲明異常(RuntimeException及其子類除外)
6 RuntimeException類
(1)RuntimeException是Exception的一個特殊子類,是運行時異常
(2)當函數拋出RuntimeException以及其子類時,函數上可以不用聲明,調用者也可以不用處理
(3)該異常發生是因爲亂傳數據而導致的,所以必須讓程序停下來由程序員修改代碼

舉例說明:

//定義一個長方形類
class ChangFangXing
{
	private double len;
	private double wid;
	//初始化長和寬
	ChangFangXing(double len,double wid)
	{
		//判斷長和寬,如果小於0就拋出異常程序結束
		if(len<=0||wid<=0)
			throw new NoFuShuException("長或寬不大於0,不是個長方形,無法求面積");
		else
		{
			this.len=len;
			this.wid=wid;
		}
		
	}
	//返回面積
	public double area()
	{
		return len*wid;
	}
}
//自定義一個異常類繼承RuntimeException成爲運行時異常
//讓程序一發生異常就程序停止
class NoFuShuException extends RuntimeException
{
	NoFuShuException(String msg)
	{
		super(msg);
	}
}

class RuntimeExceptionDemo 
{
	public static void main(String[] args) //主函數
	{
		//創建長方形對象,在這裏不try處理
		//因爲如果程序發生異常是因爲調用者誤傳參數導致的,所以需要讓程序停止,有程序員修改
		ChangFangXing cfx=new ChangFangXing(3.0,-4.0);
		//程序如果發生異常,下面語句不執行
		double a=cfx.area();
		System.out.println(a);
	}
}

7 對於異常,分兩種
(1)編譯時被檢測的異常,
(2)編譯時不被檢查的異常,運行時異常,也就是RuntimeException及其子類
8 finally代碼塊
(1)finally代碼塊裏面定義的是一定會執行的語句。包括前面讀到return語句。
(2)finally有一種情況不會被執行到,就是讀到System.exit(0);
(2)通常用於關閉資源
9 異常在子父類覆蓋的體現
(1)子類覆蓋父類方法時,父類方法拋出異常,那麼子類只能拋出該異常或該異常的子類
(2)子類覆蓋父類方法時,父類拋出多個異常,子類只能拋出多個異常的子集
(3)子類覆蓋父類方法時,父類沒有拋出異常,子類也不能拋出異常,如果子類方法發生異常,只能內部處理

總結就是:父類沒有異常,之類不能有異常。父類就算有,子類不能比他多,子類有隻能是父類異常本身或該異常的子類


二 包(package)
1 概述:對類進行分類管理,爲類提供多層命名空間,包也是封裝的一種形式。必須寫在程序的第一行

2 作用:可以以將源文件與class文件分離,提供安全性。

3 package和import關鍵字
  package用來標識class文件所屬的包,後面加包名,一般包名全部小寫,必須放在程序的第一行。如:package pack;
  import用於導入某個包裏的類文件,後面可以加包名.class文件名(代表導入具體的某個類),也可以加包名.*(代表導入某個包的全部類文件)

4 一個包中的類要被訪問,要有足夠大的權限,所以被訪問的類要被public修飾,以及成員也要被public修飾。
(1)protected(保護權限):不同包中的子類可以直接訪問父類中被protected修飾的成員。
(2)包與包之間可以使用的權限只有兩種,public和protected


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