標籤:exception
黑馬程式員——java基礎——異常------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
異常就是不正常。程式在運行時出現的不正常情況。其實就是程式中出現的問題。這個問題按照物件導向思想進行描述,並封裝成了對象。因為問題的產生有產生的原因、有問題的名稱、有問題的描述等多個屬性資訊存在。當出現多屬性資訊最方便的方式就是將這些資訊進行封裝。異常就是java按照物件導向的思想將問題進行對象封裝。
異常體系
--------java.lang.Throwable:
Throwable:可拋出的。
|--Error:錯誤,一般情況下,不編寫針對性的代碼進行處理,通常是jvm發生的,需要對程式進行修正。
|--Exception:異常,可以有針對性的處理方式
無論是錯誤還是異常,它們都有具體的子類體現每一個問題,它們的子類都有一個共性,就是都以父類名還作為子類的尾碼名。
這個體系中的所有類和對象都具備一個專屬的特點;就是可拋性。
可拋性的體現:就是這個體系中的類和對象都可以被throws和throw兩個關鍵字所操作。
異常的處理
處理方式有兩種:1、捕捉;2、拋出。
1、 java提供了特有的語句進行處理。
try
{
需要被檢測的代碼。
}
catch(異常類 變數)
{
處理異常的代碼;(處理方式)
}
finally
{
一定會執行的語句;
}
有三個結合格式:
a、try
{
}
catch ()
{
}
b、try
{
}
finally
{
}
c、try
{
}
catch ()
{
}
finally
{
}
如果出現異常,並不處理,但是資源一定關閉,所以try finally集合只為關閉資源。
記住:finally很有用,主要使用者關閉資源。無論是否發生異常,資源都必須進行關閉。
System.exit(0);//退出jvm,只有這種情況finally不執行。
當異常出現後,在子父類進行覆蓋時,有了一些新的特點
1:當子類覆蓋父類的方法時,如果父類的方法拋出了異常,那麼子類的方法要麼不拋出異常要麼拋出父類異常或者該異常的子類,不能拋出其他異常。
2:如果父類拋出了多個異常,那麼子類在覆蓋時只能拋出父類的異常的子集。
throw 和throws關鍵字的區別
throw用於拋出異常對象,後面跟的是異常對象;throw用在函數內。
throws用於拋出異常類,後面跟的異常類名,可以跟多個,用逗號隔開。throws用在函數上。
通常情況:函數內容如果有throw,拋出異常對象,並沒有進行處理,那麼函數上一定要聲明,否則編譯失敗。但是也有特殊情況。
樣本:
class Demo{int div(int a,int b)throws Exception//在功能上通過throws的關鍵字聲明了該功能有可能會出現問題。{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="+x);}catch (Exception e)//Exception e = new ArithmeticException();{System.out.println("除零啦");System.out.println(e.getMessage());// / by zero;System.out.println(e.toString());// 異常名稱 : 異常資訊。e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。//其實jvm預設的異常處理機制,就是在調用printStackTrace方法。<span style="white-space:pre"></span>//列印異常的堆棧的跟蹤資訊。}System.out.println("over");}}
異常分兩種
1:編譯時間被檢查的異常,只要是Exception及其子類都是編譯時間被檢測的異常。
2:運行時異常,其中Exception有一個特殊的子類RuntimeException,以及RuntimeException的子類是運行異常,也就說這個異常是編譯時間不被檢查的異常。
編譯時間被檢查的異常和運行時異常的區別
編譯被檢查的異常在函數內被拋出,函數必須要聲明,否編譯失敗。
聲明的原因:是需要調用者對該異常進行處理。
運行時異常如果在函數內被拋出,在函數上不需要聲明。
不聲明的原因:不需要調用者處理,運行時異常發生,已經無法再讓程式繼續運行,所以,不讓調用處理的,直接讓程式停止,由調用者對代碼進行修正。
異常的好處與原則
好處:
1、將問題進行封裝
2、將正常流程代碼和問題處理代碼相分離,方便於閱讀。
原則:
1、處理方式有兩種:try或者 throws。
2、調用到拋出異常的功能時,拋出幾個,就處理幾個。一個try對應多個catch。
3、多個catch時,父類的catch放到最下面。否則編譯會報錯,因為其餘的catch語句執行不到。
4、catch內,需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句。也不要不寫。當捕獲到的異常,本功能處理不了時,可以繼續在catch中拋出。
自訂異常:
當開發時,項目中出現了java中沒有定義過的問題時,這時就需要我們按照java異常建立思想,將項目的中的特有問題也進行對象的封裝。這個異常,稱為自訂異常。
對於除法運算,0作為除數是不可以的。java中對這種問題用ArithmeticException類進行描述。對於這個功能,在我們項目中,除數除了不可以為0外,還不可以為負數。可是負數的部分java並沒有針對描述。所以我們就需要自訂這個異常。
自訂異常的步驟:
1:定義一個子類繼承Exception或RuntimeException,讓該類具備可拋性。
2:通過throw 或者throws進行操作。
樣本:
class FuShuException extends Exception //getMessage();{private int value;FuShuException(){super();}FuShuException(String msg,int value){super(msg);this.value = value;}public int getValue(){return value;}}class Demo{int div(int a,int b)throws FuShuException{if(b<0)throw new FuShuException("出現了除數是負數的情況------ / by fushu",b);//手動通過throw關鍵字拋出一個自訂異常對象。return a/b;}}class ExceptionDemo{public static void main(String[] args) {Demo d = new Demo();try{int x = d.div(4,-9);System.out.println("x="+x);}catch (FuShuException e){System.out.println(e.toString());//System.out.println("除數出現負數了");System.out.println("錯誤的負數是:"+e.getValue());}System.out.println("over");}}
黑馬程式員——java基礎——異常