異常

異常:java在運行時期出現的不正常情況。

1.概述:按照面向對象的思想對問題進行描述和封裝,將問題變成對象,裏面包含着問題的名稱,信息以及位置等。
2.常見的問題:一種可處理的;向上抽取到一個父類中:Exception(異常)
一種是通常不處理的,向上抽取到一個父類中Error.通常都是由jvm或者系統拋出的嚴重問題,解決方法是修改代碼。

3.無論是錯誤還是異常,都有名稱、信息、位置等共性內容,向上抽取到父類中Throwable(可拋).
4.異常的體系:Throwable的子類有 Exception 和 Error.
5.問題的發生是可以拋出的,所以他們的父類是Throwavle,而且這個體系和其它體系都有不同,是因爲這個體系中的類以及其對象都具備着可拋性。

6.可拋性:可以被throw或者throws關鍵字所操作。

		class Demo
		{
			void show(int index)
			{
				int[] arr = new int[3];
				if(index>=arr.length)
					throw new ArrayIndexOutOfBoundsException("數組角標越界啦!!越界角標是:"+index);

				System.out.println(arr[index]);

				System.out.println("haha");
			}
		}

		class  ExceptionDemo
		{
			public static void main(String[] args) 
			{
				Demo d = new Demo();
				d.show(3);
				System.out.println("over");
			}
		}

7.異常分兩種:一種是編譯時需要被檢測的異常,Exception及其子類,可以進行針對性的處理;

一種是編譯時不被檢測的異常,Exception中一個特殊子類體系RuntimeException,通常不編寫處理方式,直接讓程序停止,讓調用者進行代碼的修正。
意味着:我們在自定義異常時,可以繼承Exception,也可以繼承RuntimeException.

8.針對性處理:可以通過java提供的指定的處理代碼完成。
try
{
需要被檢測的代碼;
}
catch (異常類 變量名)
{
異常的處理代碼;
}
finally
{
一定執行的代碼;
}

9.異常處理的基本原則:1.在catch異常時,對方功能聲明的是什麼異常,catch裏就處理什麼異常,這樣處理才具有針對性。
2.如果對方函數聲明多個異常,則必須由對個catch分別對這些異常進行處理。
3.如果出現多catch,父類catch則必須放在最下面。


10.異常拋出的基本原則:1.功能中用throw關鍵字拋出了異常,如果沒有被catch處理,就必須用throws關鍵字在函數上進行聲明。


注意:RuntimeException及其子類除外,也就說,功能中throw拋出的是RuntimeException和其子類對象,函數上可以不用throws進行聲明。
  函數上用throws進行聲明的原因:是爲了讓調用者在調用該功能時,進行定義預先的處理方式。
11.拋出和try處理:功能內部可以進行處理嗎?可以就catch;不可以就必須throws。

12.自定義異常:當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作,一般在函數上用throws關鍵字標示可能出現異常,好處是可以讓調用者預先進行問題的處理。

getMessage:信息;toString:名稱+信息;printStackTrace:名稱+信息+位置;

	class FuShuException extends Exception
	{
		FuShuException()
		{
			super();
		}
		FuShuException(String message)
		{
			super(message);
		}
	}

	class Demo
	{
		int div(int a,int b)throws FuShuException//在函數上用throws關鍵字標示有可能有問題。
											//這樣的好處在於可以讓調用者預先進行問題的處理。
		{
			if(b==0)
				throw new ArithmeticException("哎呀!除數爲零了。完了!");//拋出的是java已有的異常的對象。 
			if(b<0)
				throw new FuShuException("除數不可以是負數:錯誤的負數值時:"+b);//拋出了自定義異常對象。
			return a/b;
		}
	}
	class ExceptionDemo2 
	{
		public static void main(String[] args)throws  FuShuException//主函數調用了有異常的方法,
																//處理方式是聲明繼續拋出。拋給了jvm
		{
			Demo d = new Demo();
			int num = d.div(4,-1);
			System.out.println("num="+num);
			System.out.println("Hello World!");
		}
	}

13.throw和throws的區別:
throw用在函數內,用於拋出異常對象,後面跟的都是異常的對象。
throws用在函數上,用於聲明異常,後面跟的都是異常類,而且可以跟多個,用逗號隔開;

14.小細節:throw在函數中的出現,可以用於結束函數的運行,相當於return。
函數內發生異常函數上不聲明,是爲了讓調用者對代碼進行修正,而這種異常都是RuntimeException及其子類。

注意:沒catch,沒處理。

15.異常講解常見實例

除數爲零,和除數不能爲負數。

		class FuShuException extends Exception
		{
			FuShuException()
			{
				super();
			}
			FuShuException(String message)
			{
				super(message);
			}
		}
		class Test
		{
			int div(int a,int b)throws FuShuException//在函數上用throws關鍵字標示有可能有問題;這樣的好處在於可以讓調用者預先進行問題的處理。
			{
				if(b==0)
					throw new ArithmeticException("哎呀!除數爲零了。完了!");//拋出的是java已有的異常的對象。 
				if(b<0)
					throw new FuShuException("除數不可以是負數:錯誤的負數值時:"+b);//拋出了自定義異常對象。
				return a/b;
			}
		}
		class ExceptionT 
		{
			public static void main(String[] args)//throws  FuShuException//主函數調用了有異常的方法,處理方式是聲明繼續拋出。拋給了jvm
			{
				Demo d = new Demo();
				try
				{
					int num = d.div(4,-1);
					System.out.println("num="+num);
				}
				catch (FuShuException e)
				{

					System.out.println("message:"+e.getMessage());//信息
					System.out.println("tostring:"+e.toString());//名稱+信息
					e.printStackTrace();//名稱+信息+位置。其實jvm的默認處理方式,就是調用了這個方法。
					System.out.println("異常被我抓住啦!!");
				}
				System.out.println("Hello World!");
			}
		}

16.finally 語句:這個代碼塊中定義的是一定會執行的代碼。
1.不能被catch塊中的return語句結束,可是能被System.exit(0)結束。
2.主要用於關閉資源,只要使用了資源,就一定要將其關閉。
3.應用:數據庫的連接,連接——操作——關閉。可能在操作過程中出現異常,沒關閉數據庫,就需要把關閉數據庫放在finally語句裏面。


17.組合方式:
try{}catch (){}、try{}catch(){}、try{}finally{}(這種用於關閉資源)

18.異常在覆蓋時的細節
1.子類在覆蓋父類方法時,如果父類方法拋出了異常,子類覆蓋的方法只能拋出父類方法異常或其子類。
2.父類方法如果拋出多個異常,子類在覆蓋父類方法時,只能拋出父類異常的子集。
3.如果父類中的方法沒有拋出異常,子類覆蓋父類時,絕對不能聲明異常。只能進行 try{} catch 處理;如果處理不了,那就應該讓程序
停掉,讓調用者知道。即在catch中拋出RuntimeException異常或其子類對象,這時不用拋,RuntimeException不用在函數上聲明。



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