JAVA 異常處理

胡小冰發表於2020-10-31

1、異常:就是程式執行時出現不正常情況
異常由來:問題也是現實生活中一個具體的事物,也可以通過java的類的形式進行描述。並封裝成物件。其實就是java對不正常情況進行描述後的物件體現。

對於問題的劃分(兩種):一種是嚴重的問題,一種是非嚴重的問題;
對於嚴重的,java通過Error類進行描述。
對於Error一般不編寫針對性的程式碼對其進行編寫
對於非嚴重的,java通過Exception類進行描述。
對於Exception可以使用針對性的處理方式進行處理
無論Error還是Exception都具有一些共性內容

Throwable

  • |-Error
  • |-Exception
    —— |-RuntimeException

2、異常的處理
java 提供了特有語句進行處理。
try{
需要被檢測的程式碼
}

catch(異常類 變數){
處理異常的程式碼,處理方式
}

finally{
一定會執行的語句
}

3、對捕獲到的異常物件常見方法操作
String getMessage( ):捕獲異常資訊。

在函式上宣告,讓呼叫出進行處理,不處理則編譯失敗。

對多異常的處理
1、宣告異常時,建議宣告更為具體,這樣處理的可以更具體。
2、對方宣告幾個異常,就對應有幾個catch塊,不要定義多餘的catch塊。
如果多個catch塊中的異常出現繼承關係,父類異常catc塊放在最下面。

建議:
在進行catch處理時,catch中一定要定義具體處理方式,也不要簡單的就寫一條輸出語句。

<自定義異常>

當在函式內部出現了throw丟擲異常物件,那麼就必須要給對應的處理動作:
要麼在內部try catch處理,要麼在函式上宣告讓呼叫者處理。

一般情況在函式內部出現異常,函式上需要宣告。
發現列印的結果中只有異常的名稱,卻沒有異常的資訊,那麼如何定義異常資訊呢?
因為父類中已經把異常資訊的操作都完成了,所以子類只要在構造時,將異常資訊傳遞給父類通過super語句,那麼
就可以直接通過getMessage方法獲取自定義的異常資訊。

自定義異常:
定義類繼承Exception或者RuntimeException
1、為了讓該類自定義類具備可拋性。
2、讓該類具備操作異常的共性方法。

當要定義自定義異常的資訊時,可以使用父類已經定義好的功能。
class MyException extends Exception
{
	MyException(String message)
	{
		super(message);
	}
}

throw和throws的區別:throw使用在函式上,throws使用在函式內。throws後面跟的異常類,可以跟多個,用“ ,”隔開
throw後跟的是異常物件。

當函式內容有throw丟擲異常物件,並未進行try處理,必須要在函式上宣告,都在編譯失敗。
注意:RuntimeException除外,也就是說,函式內如果丟擲的RuntimeException異常,函式可以不用宣告。

如果函式宣告瞭異常,呼叫者需要進行處理,處理方法可以throws,可以try。

finaly{ } //存放的是一定對被執行的程式碼 通常用於關閉資源。

finally中定義的通常是 關閉資原始碼。因為資源必須釋放。
finally只有一種情況不會執行,當執行到System.exit(0);finally不會執行。

異常處理語句:
1、
try
{
需要被檢測的程式碼;
}
catch( )
{
處理異常的程式碼;
}

2、
try
{

}
finally
{

}
3、
try
{
需要被檢測的程式碼;
}
catch( )
{
處理異常的程式碼;
}
finally
{
一定會執行的程式碼;
}

異常的好處:1、將問題進行封裝
2、將正常流程程式碼和問題處理程式碼相分離,方便於閱讀。
異常的處理原則:
1、處理方式有兩種:try 或者throws;
2、呼叫到丟擲異常的功能時,丟擲幾個,就處理幾個。
一個try對應多個catch。
3、多個catch,父類的catch放到最下面。
4、catch內,需要定義針對性的處理方式,不要簡單的定義printStackTrace,輸出語句。
try{
throw new AException( );
}
catch( AException e){
throw e;
}

異常的注意事項:
在子父類覆蓋時:
1、子類丟擲的異常必須是父類的異常的子類或者子集;
2、如果父類或者介面沒有異常丟擲時,子類覆蓋出現異常,只能try不能拋。