別樣JAVA學習(六)繼承下(2.3)異常下
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)異常下