1. 程式人生 > >別樣JAVA學習(六)繼承下(2.3)異常下

別樣JAVA學習(六)繼承下(2.3)異常下

關閉 exit dsm 練習 方便 pub xtend 運行 script

1、RuntimeException

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


假設在函數內容拋出該異常,函數上能夠不用聲明。編譯一樣通過。

假設在函數上聲明了該異常,調用者能夠不用進行處理。編譯一樣通過。


之所以不用在函數上聲明,是由於不須要讓調用者處理。

當該異常發生,希望程序停止。

由於在執行時,出現了無法繼續運算的情況,

希望停止程序後。對代碼進行修正。


例:

class Person
{
	public void checkName(String name)
	{
		//if(name.equals("lisi"))//相當於NullPointerException
		if("lisi".equals(name))//相當於if(name!=null && name.equals("lisi"))
			System.out.println("YES");
		else 
			System.out.println("No");
	}
}
main()              //代碼簡寫。。。。要執行自行加上些其它東西
{
	Person p=new Person();
	p.checkName(null);
}

因此自己定義異常時,假設該異常的發生。無法再繼續進行運算,

就讓自己定義異常繼承RuntimeException。


玩點有趣的。

是不是發現,一有異常程序就停止。


對於異常分兩種:

1。編譯時被檢測的異常。(這時異常是可處理的)

2,編譯時不被檢測的異常(執行時異常。RuntimeException以及其子類)

異常進入時會進行instanceof推斷是否為RuntimeException



2、異常-finally

技術分享

finally

比如。client與服務端鏈接。無論是否出現錯誤都要運行斷開操作,

但出現錯誤client就不需對從服務端讀取到的數據進行處理,跳過。

public void method()
{
	連接數據庫;
	數據操作;//throw new SQLException
	關閉數據庫;//該動作,不管數據操作是否成功。一定要關閉資源
	
	try
	{
		連接數據庫;
		數據操作;//throw new SQLException
	}
	catch(SQLException e)
	{
		會對數據庫進行異常處理;
        }
	finally
	{
		關閉數據庫;
	}	
}


3、異常-處理語句其他格式

1,

try{}catch(){}

2,

try{}catch(){}finally{}

3,

try{}finally{//一定要運行的代碼}

記住一點:catch是用於處理異常。

假設沒有catch就代表異常沒有被處理過。假設該異常是檢測時異常,那麽必須聲明。



4、異常-覆蓋時的異常特點

1,子類在覆蓋父類時,假設父類的方法拋出異常。那麽子類的覆蓋方法,僅僅能拋出父類的異常或該異常的子類。


假設這樣:

class Zi extends Fu
{
	void show()throws CException//或者BException。不但是CException 
	{
	}
}
技術分享



class Test 
{
	void function(Fu f)
	{
		f.show();
	}
}
class ExceptionDemo7
{
	public static void main(String[] args)
	{
		Test t=new Test();
		t.function(new Fu());
	}
}

技術分享

假設Zi真出現C異常。那就在內部處理

2。假設父類的方法拋出多個異常,那麽子類在覆蓋該方法時,僅僅要父類異常的子集。

3,假設父類或接口的方法中沒有異常拋出,那麽子類在覆蓋方法時,也不可拋出異常。

假設子類發生異常,就必需要進行try處理。絕對不能拋。




5、異常-練習

有一個圓形和長方形,都能夠獲取面積。

對於面積假設出現非法的數值。視為是獲取面積出現故障。

問題通過異常來表示。


6、異常-總結

異常:

是什麽?是對問題的描寫敘述。將問題進行對象的封裝。

異常體系:

Throwable

|--Error

|--Exception

|--RuntimeException

異常體系的特點:異常體系中的全部類以及建立的對象都具備可拋性,

也就是說能夠被throw和throwskeyword所操作,

僅僅有異常體系具備這個特點。

------------------------------------------

throw和throws的使用方法:

throw定義在函數內,用於拋出異常對象。

throws定義在函數內,用於拋出異常類,能夠拋出多個用逗號隔開。


當函數內容有throw拋出異常對象。並未進行try處理。

必需要在函數上聲明。都在編譯失敗。

註意。RuntimeException除外。

也就是說,函數內假設拋出的RuntimeException異常。函數上能夠不用聲明。

假設函數聲明了異常。調用者須要進行處理,處理方法能夠throws能夠try。

------------------------------------------

異常有兩種:

編譯時被檢測異常

該異常在編譯時,假設沒有處理(沒有拋也沒有try)。編譯失敗

該異常被標識,代表這能夠被處理。

執行時異常(編譯時不檢測)

在編譯時。不須要處理。編譯器不檢查。

該異常的發生。建議不處理,讓程序停止,須要對代碼進行修正。

------------------------------------------

異常處理語句:

try{//須要被處理的代碼;}catch(){//處理異常的代碼;}finally{//一定會運行的代碼;}

有三中結合格式:

1、

try{}catch(){}

2、

try{}finally{}

3、

try{}catch(){}finally{}

註意:

1、finally中定義的一般是 關閉資源碼。由於資源必須釋放。


2、finally僅僅有一種情況不會運行。當運行到System.exit(0);

------------------------------------------

自己定義異常:

定義類繼承Exception或者RuntimeException

1,為了讓該自己定義類具備可拋性。

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

當要定義自己定義異常的信息時。能夠使用父類已經定義好的功能。

異常信息傳遞給父類的構造函數。

class MyException extends Exception

{

MyException(String message)

{

super(message);

}

}

------------------------------------------

異常的優點:

1,將問題進行封裝

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

異常的處理原則:

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

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)
{
throw new BException();
}
------------------------------------------
異常的註意事項:
在子父類覆蓋時:
1。子類拋出的異常必須是父類的異常的子類或者子集。
2,假設父類或者接口沒有異常拋出時,子類覆蓋出現異常。僅僅能try不能拋。

參閱
ExceptionTest.java 老師用電腦上課
ExceptionTest1.java 圖形面積

別樣JAVA學習(六)繼承下(2.3)異常下