異常處理是程序中不可缺少的一個環節.首先從異常的概述最終再到自定義異常處理.
異常:程序在運行時出現不正常情況
例如算數異常:
編譯通過,但當不小心把除數錄入爲0時,就會導致如下異常。
該異常違反了數學計算規範,除數不能爲0。
異常的由來:
問題也是現實生活中一個具體的實物,也可以通過java類的形式進行描述,並封裝成對象。
其實就是java對不正常情況進行描述後的對象體現。
對與問題的劃分:
1.嚴重error (超出JVM範圍,一般不編寫代碼對其進行處理,例如內存溢出)不治之症
2.非嚴重exception(在JVM範圍內,可以挽救,例如:數組下標越界,空指針)頭疼腦熱
因爲以上兩種問題,都用共性內容例如:不正常情況的信息,引發原因等。所以,java對其向上抽取得到了他們的爸爸Throwable(所有錯誤或異常的超類)
異常的處理代碼格式
1,try和catch
2,try和finally
3,try和catch和finally
Java提供特有的語句進行處理
Try{
//需要被檢測的代碼
}catch(Exception e){
//處理方式,例如:
e.printstacktrace();//異常名稱,異常信息,異常出現的位置(JVM默認異常處理機制)
}finally{
//一定會執行的,通常用於關閉資源
}
注意:爲了提高安全性,可提前在函數上聲名異常,這樣會強行讓調用處進行處理,要麼捕捉,要麼拋出,否則編譯就會失敗,例如:
int div(int a, int b)throws Exception
{
returna/b;
}
對多異常的處理.
1,聲明異常時,建議聲明更具體的異常,具體到Exception的子類.這樣處理的可以更具體.
2,對方聲明幾個異常,就要對應有幾個catch快,不要定義多餘的catch快.如果多個catch快中的異常出現繼承關係,父類異常catch快放在最下面.否則子類異常都進不去.
建議在進行catch處理時,catch中一定要定義具體處理方式
異常在子父類覆蓋中的體現[原則,父類能解決的範圍內拋出]
1,子類在覆蓋父類時,如果父類的方法拋出異常,那麼子類的覆蓋方法,只能拋出父類的異常或者該異常的子類.或者不拋自行try解決.
2,如果父類方法拋出多個異常,那麼子類覆蓋父類時,只能拋出父類異常的子集
3,如果父類或接口的方法中沒有異常拋出,那麼子類在覆蓋方法時也不能拋出異常
如果子類方法發生了異常,就必須要自行try處理,絕對不能拋,因爲父類解決不了
Exception中有一個特殊的子類異常:RuntimeException運行時異常。
如果在函數內容上拋出該異常,函數可以不用聲明,編譯可以通過.(他不需要調用者處理)
當該異常發生,必要程序停止。因爲在運行時,出現了無法繼續運算的情況,要停止程序後,對代碼進行修改。
自定義異常:
按照java的面向對象思想,將程序中出現的特有問題進行封裝
定義類繼承Exception或者RuntimeException
1,爲了讓該自定義類具備可拋性
2,讓該類具備操作異常的共性方法
當要定義自定義異常的信息時,可以使用父類已經定義好的功能.
將異常信息傳遞給父類的構造函數(下面有實例)
自定義異常時:如果異常發生,無法再繼續進行運算,
就讓自定義異常繼承RuntimeException。
例子:
class NoValueException extends RuntimeException{//自定義異常,繼承RuntimeException
NoValueException(String message){
super(message);
}
}
interface Shape{//定義形狀接口,內部有獲取面積功能
void getArea();
}
class Rec implements Shape{//實現Shape接口
private int len,wid;
Rec(int len,int wid){
if(len<=0||wid<=0)//判斷拋出條件
throw new NoValueException("出現非法值");//用throw關鍵字拋出自定義異常
this.len=len;
this.wid=wid;
}
public void getArea(){//複寫接口中的方法
System.out.println(len*wid);
}
}
public class Exception{
public static void main(String[] args) {
Rec r=new Rec(-3,3);//實驗,編譯不通過.直接停掉.
r.getArea();
}
}
異常的好處:
1,將問題進行封裝
2,將正常流程代碼和問題處理代碼相分離,方便於閱讀.
異常的處理原則:
1,處理方式有兩種:try或者throws
2,調用到拋出異常的功能時,拋出幾個,就處理幾個,一個try對應一個catch
3,多個catch,父類的catch快放到最下面
4,catch內,需要定義針對性處理方式,不要簡單的定義一些輸出語句