---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ----------------------
自定義異常
因爲項目中會出現特有的問題。而這些問題並未被java所描述並封裝對象。所以對這些特有的問題可以按照java的對問題的封裝的思想,將特有的問題,進行自定義異常封裝。
當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作。
要麼在內部try-catch處理。
要麼在函數上聲明讓調用者處理
一般情況下,函數內出現異常,函數上需要聲明。發現打印的結果中只有異常的名稱,卻沒有異常的信息。因爲自定義異常並未定義信息。
如何定義異常信息?
因爲父類中已經把異常信息的操作都完成了。
所以父類只要在構造時,將異常信息傳遞給父類通過super語句;
那麼就可以直接通過getMessage方法獲取自定義的異常信息。
自定義異常要求:
必須是自定義類繼承Exception。
繼承Exception原因:
異常體系有一個特點:因爲異常類和異常對象都被拋出。他們都具有可拋性,
這個可拋性是Throwable這個體系中獨有特點。
只有這個體系中的類和對象纔可以被throws和throw操作。
/*
需求:在本程序中,對於除數是-1,也視爲是錯誤的是無法進行運算的,
那麼就要對這個問題進行自定義描述。
*/
//自定義異常:必須是自定義類繼承Exception。
//自定義異常類要定義信息。否則會發現打印的結果中只有異常的名稱,沒有異常的信息。
class FuShuException extends Exception{
private int num;
//因爲父類中已經把異常信息的操作都完成了。
//所以父類只要在構造時,將異常信息傳遞給父類通過super語句,
//那麼就可以直接通過getMessage方法獲取自定義的異常信息。
FuShuException(String msg,int num){
super(msg);
this.num = num;
}
public int getValue(){
return num;
}
}
class Demo{
//一般情況下,函數內出現異常,函數上需要聲明。
//當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作。
//要麼在內部try-catch處理。
//要麼在函數上聲明讓調用者處理
int div(int a,int b)throws FuShuException{
if(b<0){
//手動通過throw關鍵字拋出一個自定義異常對象
throw new FuShuException("這裏出現負數異常",b);
}
return a/b;
}
}
class ExceptionDemo{
public static void main(String[] args){
Demo d = new Demo();
try{
int x = d.div(5,-1);
System.out.println(x);
}catch(FuShuException e){
System.out.println(e.getMessage()+" "+e.getValue());
}
System.out.println("over");
}
}
運行結果:
throws和throw的區別
1.thows用在函數上 後面跟異常類,可以跟多個,用逗號分開
2.throw用在函數內 後面跟的是異常對象。
RuntimeException
Exception 中有一個特殊的子類異常RuntimeException運行時異常
1.如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過。
2.如果在函數上聲明瞭該異常,調用者可以不用進行處理,編譯一樣通過。
之所以不用在函數上聲明,是因爲,不需要讓調用者處理,當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,希望進製程序後,對代碼進行修正。
自定義異常時,如果該異常的發生,無法在繼續進行運算,就讓自定義異常繼承RuntimeException。
對於異常分兩種
1.編譯時被檢測的異常。一定要在方法上聲明,一定要對其進行處理。有兩種方式。
2.編譯時不被檢測的異常。(運行時異常,RuntimeException以及其子類)不用在方法上聲明,也不用處理
//如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過。
//如果在函數上聲明瞭該異常,調用者可以不用進行處理,編譯一樣通過。
class FuShuException extends RuntimeException{
private int num;
FuShuException(String msg,int num){
super(msg);
this.num = num;
}
public int getValue(){
return num;
}
}
class Demo{
//RuntimeException的子類異常可以不用聲明 throws FuShuException
//非RuntimeException異常一定要聲明throws FuShuException,否則不能編譯通過。
int div(int a,int b){
if(b<0){
throw new FuShuException("這裏出現負數異常",b);
}
return a/b;
}
}
class ExceptionDemo{
public static void main(String[] args){
Demo d = new Demo();
int x = d.div(5,-1);
System.out.println(x);
System.out.println("over");
}
}
finally
finally代碼塊:定義一定執行的代碼
通常用於關閉資源,或者一定要執行一次的代碼。
//finally代碼塊:定義一定執行的代碼
//通常用於關閉資源,或者一定要執行一次的代碼。
class FuShuException extends Exception{
FuShuException(String msg){
super(msg);
}
}
class Demo{
int div(int a,int b)throws FuShuException{
if(b<0){
throw new FuShuException("這裏出現負數異常");
}
return a/b;
}
}
class ExceptionDemo{
public static void main(String[] args){
Demo d = new Demo();
try
{
int x = d.div(4,-1);
System.out.println(x);
}
catch (FuShuException e)
{
System.out.println(e.toString());
//return;
}finally{
System.out.println("finally");//finally中放的是一定要執行的代碼
}
System.out.println("OVER");
}
}
小例子
記住一點:catch是用於處理異常。如果沒有catch就代表異常類沒有被處理過,如果該異常是檢測時異常。那麼必須聲明。
/*
public void method(){ //這裏不需要聲明 throws Exception 也能編譯通過
try
{
throw new Exception();
}
catch (Exception e)
{
語句
}
}
*/
/*
public void method() throws Exception{ //這裏要聲明(除非RuntimeException) throws Exception 不然不能編譯通過
try
{
throw new Exception();
}
finally
{
關閉資源語句
}
}
*/
異常覆蓋時的異常特點
異常在子父類覆蓋中的體現:
1.子類在覆蓋父類時,如果父類的方法拋出異常,那麼子類的覆蓋方法,只能拋出父類的異常或者該異常的子類
2.如果父類方法拋出多個異常,那麼子類在覆蓋方法時,只能拋出父類異常的子類。
3.如果父類或者接口的方法中沒有異常拋出,那麼子類在覆蓋方法時,也不可以拋出異常。
4.如果子類的方法發生了異常,就必須用try-catch處理。絕對不能拋出!
class AException extends Exception{
}
class BException extends Exception{
}
class CException{
}
/*
Exception
|--AException
|--BException
|--CException
*/
class Fu{
public show() throws AException{
}
}
class Zi{
//public show() throws AException{}
//public show() throws BException{}
/*public show(){
try{}
catch (...){處理語句}AException、BException、CException都可以在內部被處理,就不用拋出了~
}*/
}
附加吧:
異常的好處:
1.將問題進行封裝。
2.將正常流程代碼和問題處理代碼相分離,方便閱讀。
異常的處理原則:
1.兩種方式:try或者拋出
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)
{
//對AException進行處理
throw new BException;
}
練習題 請參閱 傳智播客畢向東Java基礎視頻教程-day10-06-面向對象(練習四).avi
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
詳情請查看:http://edu.csdn.net