java基礎-面向對象-異常

一、異常概述
1、異常:就是程序在運行時出現的不正常情況。是對問題的描述,將問題進行對象的封裝。
2、異常由來:問題也是現實生活中的一個具體事物,也可以通過java的類的形式進行描述,並封裝成對象。其實就是java對不正常情況進行描述後的對象體現。
3、異常體系:
Throwable
      |--Error  //嚴重的問題,如:運行的類不存在或者內存溢出等。對於Error一般不編寫針對性的代碼對其進行處理。                 
      |--Exception  //非嚴重的問題。對於Exception可以使用針對性的處理方式進行處理。
            |--RuntimeException  //特殊異常類。如果在函數內拋出該異常,函數上可以不用聲明。如果在函數上聲明瞭該異常,調用者可以不用進行處理。
異常體系的特點:異常體系中的所有類以及建立的對象都具備可拋性。也就是說可以被throwthrows關鍵字所操作。可拋性是Throwable這個體系中的獨有特點
4、throw和throws的區別
throw:定義在函數內,用於拋出異常對象。
throws:定義在函數上,用於拋出異常類。可以拋出多個異常,用逗號隔開。
當函數內容有throw拋出異常對象,並未進行try處理。必須要在函數上聲明,否則編譯失敗。
注意:RuntimeException除外。也就說,函數內如果拋出的RuntimeExcpetion異常,函數上可以不用聲明。
如果函數聲明瞭異常,調用者需要進行處理。處理方式可以throws可以try。
5、異常有兩種
編譯時被檢測的異常
    該異常在編譯時,如果沒有處理(沒有拋也沒有try),編譯失敗。該異常被標識,代表着可以被處理。
運行時異常編譯時不被檢測
    在編譯時,不需要處理,編譯器不檢查。該異常的發生,建議不處理,讓程序停止。因爲在運行時,出現了無法繼續運算的情況,希望停止程序後,對代碼進行修正。如:RuntimeException以及其子類。
   
二、異常的處理
1、java提供了特有的語句進行處理。
try
{
    需要被檢測的代碼;
}
catch(異常類 變量)
{
    處理異常的代碼;(處理方式)
}
finally
{
    一定會執行的語句;
}
2、異常處理語句的格式:
try                                try                                try                                    
{                                   {                                   {
}                                   }                                   }
catch()                        catch()                         finally
{                                   {                                   {
}                                   }                                   }
finally
{
}
3、finally代碼塊:定義一定執行的代碼。 通常用於關閉資源。只有一種情況不會執行。當執行到System.exit(0);fianlly不會執行。
4、對捕獲到的異常對象進行常見方法操作。
        getMessage():獲取異常信息,返回字符串。
        toString():獲取異常類名和異常信息,返回字符串。
        printStackTrace():獲取異常類名和異常信息,以及異常出現在程序中的位置,返回值void。
        printStackTrace(PrintStreams):通常用該方法將異常內容保存在日誌文件中,以便查閱。  
例:
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:SimSun;font-size:14px;">class Demo
{
	int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通過throws關鍵字生命了該功能有可能會出問題。
	{
		
		int[] arr = new int[a];
		System.out.println(arr[4]);
		return a/b;
	}
}
 
class ExceptionDemo
{
	public static void main(String[] args)
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,0);
			System.out.println("x="+x);
		}
		catch (ArithmeticException e)
		{
			System.out.println(e.toString());
			System.out.println("除數爲0啦!");
		}
		catch (ArrayIndexOutOfBoundsException e)
		{
			System.out.println("角標越界");
			System.out.println(e.toString());
		}
		catch (Exception e)//Exception e = new ArithmeticException();
		{
			System.out.println(e.getMessage());// / by zero
			System.out.println(e.toString());// 異常名稱:異常信息
 
			e.printStackTrace();//異常名稱,異常信息,異常出現位置
								//其實jvm默認的異常處理機制,就是在調用printStackTrace方法。
								//打印異常的堆棧的跟蹤信息。
		}
	}
}</span></span>


三、自定義異常
自定義異常:
        定義類繼承Exception或者RuntimeException
        a、爲了讓該自定義類具備可拋性。
        b、讓該類具備操作異常的共性方法。
        當要定義自定義異常的信息時,可以使用父類已經定義好的功能。
        將異常信息傳遞給父類的構造函數。
    自定義異常時:如果該異常的發生,無法再繼續進行運算,就讓自定義異常繼RuntimeException。

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

例:在本程序中,對於除數是負數,也視爲是錯誤的是無法進行運算的。那麼就需要對這個問題進行自定義的描述。
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:SimSun;font-size:14px;">class FuShuException extends Exception
{
	private int value;
	FuShuException(String msg,int value)
	{
		super(msg);
		this.value = value;
	}
	public int getValue()
	{
		return value;
	}
}
 
class Demo
{
	int div(int a,int b)throws FuShuException
	{
		if(b<0)
			throw new FuShuException("除數出現負數了------",b);//手動通過throw關鍵字拋出一個自定義異常對象。
		return a/b;
	}
}
 
class ExceptionDemo1
{
	public static void main(String[] args)
	{
		Demo d = new Demo();
		try
		{
			int x = d.div(4,-9);
			System.out.println("x="+x);
		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			System.out.println("負數是"+e.getValue());
		}
	}
}</span></span>

運行結果:


四、異常的好處
    1、將問題進行封裝。
    2、將正常流程代碼和問題處理代碼相分離,方便於閱讀。

五、異常的處理原則 
    1、處理方式有兩種:try或者 throws。
    2、調用到拋出異常的功能時,拋出幾個,就處理幾個。一個try對應多個catch。
    3、多個catch時,父類的catch放到最下面。否則編譯會報錯,因爲其餘的catch語句執行不到。
    4catch內,需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句。也不要不寫。當捕獲到的異常,本功能處理不了時,可以繼續在catch中拋出。

六、異常注意事項
1、catch是用於處理異常。如果沒有catch就代表異常沒有被處理過,如果該異常是檢測時異常。那麼必須聲明。
2、異常在子父類覆蓋中的體現:
       a.子類在覆蓋父類時,如果父類的方法拋出異常,那麼子類的覆蓋方法,只能拋出父類的異常或該異常的子類。
       b.如果父類方法拋出多個異常,那麼子類在覆蓋方法時,只能拋出父類異常的子集。
       c.如果父類或者接口的方法中沒有異常拋出,那麼子類在覆蓋方法時,也不可以拋出異常。
       如果子類方法發生了異常。就必須要進行try處理。絕對不能拋。

七、包
對類文件進行分類管理。
給類提供多層命名空間  。  
包必須寫在程序的第一行。
類的全稱:包名.類名。
包也是一種封裝形式。    
與包之間進行訪問,被訪問的包中的類以及類中的成員,需要public修飾。
不同包中的子類還可以直接訪問父類中被protected權限修飾的成員。
包與包之間可以使用的權限只有兩種,public     protected
                       public    protected    default    private
同一個類中         ok             ok              ok           ok
同一個包中         ok             ok              ok           
子類                   ok             ok    
不同包中            ok 

import 導入的是包中的類,不會導入包中的子包。




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