異常:
通俗講就是程序在運行時出現不正常情況。
-
異常由來
問題也是現實生活中一個具體的事物,也可以通過java的類的形式進行描述。並封裝成對象。
其實就是java對不正常情況進行描述後的對象體現。對於問題的劃分 兩種:一種是嚴重的問題,一種非嚴重的問題。
-對於嚴重的,java通過Error類進行描述。
對於Error- -般不編寫針對性的代碼對其進行處理.
-對與非嚴重的,java通 過Exception類進行描述。
對於Exception可以使用針對性的處理方式進行處理。
無論Error或者Exception都具有一些共性 內容。
比如:不正常情況的信息,引發原因等。
- 異常的處理
java提供了特有的語句進行處理。
try
{
需要被檢測的代碼;
}
catch(異常類變量)
{
處理異常的代碼;(處理方式)
}
finally
{
一定會執行的語句
}
-
對捕獲到的異常對象進行常見方法操作
string getMessage () : 獲取異常的信息
String toString():異常名稱,異常信息
e.printStackTrace();異常名稱,異常信息,異常出現的位置 -
對多異常的處理.
- 聲明異常時,建議聲明更爲具體的異常。這樣處理的可以更具體。
- 對方聲明幾個異常,就對應有幾個catch塊。 不要定義多餘的catch塊。
如果多個catch塊中的異常出現繼承關係,父類異常catch塊放在最下面。 - 建立在進行catch處理時,catch中一 定要定義具體處理方式。
不要簡單定義一句e.printstackTrace(),也不要簡單的就書寫一條輸出語句
自定義異常。
基本操作
當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作。
要麼在內部try catch處理。
要麼在函數.上聲明讓調用者處理。
一般情況在,函數內出現異常,函數上需要聲明。
-
如何定義異常信息呢?
因爲父類中已經把異常信息的操作都完成了.
所以子類只要在構造時,將異常信息傳遞給父類通過super語句.
那麼就可以直接通過getMessage方法獲取自定義的異常信息。 -
自定義異常:
必須是自定義類繼承Exception. -
繼承Exfeption原因:
異常體系有一個特點:因爲異常類和異常對象都被拋出.
他們都具備可拋性。這個可拋性是Throwable這個體系中獨有特點。
只有這個體系中的類和對象纔可以被throws和throw操作。
throws和throw有侷限性,只有繼承了Exception,Throwable,Error可以用- throws和throw區別:
1)作用不同:
throw用於程序員自行產生並拋出異常;
throws用於聲明在該方法內拋出了異常
2) 使用的位置不同:
throw位於方法體內部,可以作爲單獨語句使用;
throws必須跟在方法參數列表的後面,不能單獨使用。
3)內容不同:
throw拋出一個異常對象,且只能是一個;
throws後面跟異常類,而且可以有多個。
- throws和throw區別:
異常與自定義異常代碼見如下
- 異常練習代碼
class Demo1
{
int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException //在功能上通過throws的關鍵字聲明瞭該功能有可能會出現問題.
//在函數上聲明異常.
{
int [] arr = new int[a]; //便於提高安全性,讓調用出進行處理。不處理編譯失敗.
System.out.println(arr[4]);
return a/b; //除0 產生 new AritchmeticException()
}
}
public class 面向對象09_06異常 {
public static void main(String[] args)//throws Exception 拋出異常
{
Demo1 d=new Demo1();
try
{
//需要被檢測的代碼;
int x = d.div(5, 0);//除0 產生 new AritchmeticException()
System.out.println("x="+x);
}
catch (ArithmeticException e) //(異常類變量)Exception e = new AritchmeticException()
{
//處理異常的代碼;(處理方式)
//一般工程裏面搞個日誌文件便於管理者處理異常
//不可以簡單的一個輸出語句
System.out.println("除零了"+'\n');
System.out.println(e.getMessage()+'\n');//異常信息
System.out.println(e.toString()+'\n');//異常名稱,異常信息
e.printStackTrace();//異常名稱,異常信息,異常出現的位置
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("數組越界了"+'\n');
System.out.println(e.toString()+'\n');
}
System.out.println("over");
}
}
- 自定義異常練習代碼
//自定義異常
class FuShuExceotion extends Exception
{
/*
class Throwable //是Exception子類
{
private String msg;
Throwable(String msg)
{
this.msg=msg;
}
public String Getmsg()
{
return msg;
}
}
*/
private int value;
public FuShuExceotion(String msg,int value)
{
super(msg);//繼承了上面父類 Throwable
this.value=value;
}
public int GetValue()
{
return value;
}
}
class Demo2
{
int div(int a,int b) throws FuShuExceotion
{
if(b<0)
throw new FuShuExceotion("出現了除數是負數的情況 /by fushu",b);
//手動通過throw關鍵字拋出一個自定義異常對其定義情況
return a/b;
}
}
public class 面向對象09_09自定義異常 {
public static void main(String[] args)
{
Demo2 d = new Demo2();
try
{
//測試語句
int x= d.div(4, -1);
System.out.println("x="+x);
}
catch (FuShuExceotion e)
{
//處理方法
System.out.println(e.toString());//異常名稱,異常信息
System.out.println("錯誤的負數是:"+e.GetValue());
}
}
}