java基礎 -------異常處理機制
異常處理機制
異常發生的原因
- 使用者輸入了非法資料
- 要開啟的檔案不存在
- 網路通訊是連線中斷,或者 JVM 記憶體溢位
- 其他一些物理錯誤
常見的三種異常的型別:
- 檢查性異常:最具代表性的檢查異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。
- 執行時異常:執行時異常時可能被程式設計師避免的異常。
- 錯誤:錯誤不是異常,而是脫離程式設計師控制的問題
Exception 類的層次
Exception 和 Error 是 Throwable 的子類
Exception 和 Error 的子類名都是以父類名作為字尾。
注意:如果讓一個類成為異常類,必須要繼承異常體系,因為只有成為異常體系的子類才有資格具備可拋性
捕獲異常
使用 try 和 catch 關鍵字可以捕獲異常。try/catch 程式碼放在異常可能發生的地方
tyr
{
}catch(Exception e)
{
// Catch 塊
}finally{ // 通常用來關閉(釋放)資源
}
Catch 語句包含要捕獲異常型別的宣告。當保護程式碼塊中發生一個異常時, try 後面的 catch 塊就會被檢查。如果發生的異常包含在 catch 塊中,異常就會被傳遞到該 catch 塊,這和傳遞一個引數到方法是一樣。
finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。
無論是否發生異常,finally 程式碼塊中的程式碼總會被執行。
在 finally 程式碼塊中,可以執行清理型別等收尾善後性質的語句。
多重捕獲塊
一個 try 程式碼塊後面跟隨多個 catch 程式碼塊的情況就叫多重捕獲。
try{
// 程式程式碼
}catch(異常型別1 異常的變數名1)
{ // 程式程式碼
}catch(異常型別2 異常的變數名2){
// 程式程式碼
}catch(異常型別2 異常的變數名2){
// 程式程式碼
}
可以在 try 語句後面新增任意數量的 catch 塊。
如果保護程式碼中發生異常,異常被拋給第一個 catch 塊。
如果丟擲異常的資料型別與 ExceptionType1 匹配,它在這裡就會被捕獲。
如果不匹配,它會被傳遞給第二個 catch 塊。
如此,直到異常被捕獲或者通過所有的 catch 塊。
注意下面事項:
- catch 不能獨立於 try 存在。
- 在 try/catch 後面新增 finally 塊並非強制性要求的。
- try 程式碼後不能既沒 catch 塊也沒 finally 塊。
- try, catch, finally 塊之間不能新增任何程式碼。
throws/ throw 關鍵字:
如果一個方法沒有捕獲到一個檢查性異常,那麼該方法必須使用 throws 關鍵字來宣告。throws 關鍵字放在方法簽名的尾部。
也可以使用 throw 關鍵字丟擲一個異常,無論它是例項化的還是剛捕獲到的。
public class className
{
public void fangfa throws RemoteException
{
throw new RemoteException();
}
}
一個方法可以宣告丟擲多個異常,多個異常之間用逗號隔開。
宣告自定義異常
在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。
- 所有異常都必須是 Throwable 的子類。
- 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
- 如果你想寫一個執行時異常類,那麼需要繼承 RuntimeException 類。
異常的注意事項:
1.子類在覆蓋父類的方法時,父類的方法如果丟擲了異常,那麼子類的方法只能丟擲父類的異常 或者該異常的子類。
2. 如果父類丟擲多個異常,那麼子類只能丟擲父類異常的子集。
簡單說: 子類覆蓋父類只能丟擲父類的異常或者子類或者子集。
注意:如果父類的方法沒有丟擲異常。那麼子類覆蓋時絕對不能丟擲。