1、java 異常
異常指不期而至的各種狀況,如:文件找不到、網絡連接失敗、非法參數等。
異常是一個事件,它發生在程序運行期間,干擾了正常的指令流程。
Java通過API中 Throwable 類的衆多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的實例,描述了出現在一段編碼中的 錯誤條件。當條件生成時,錯誤將引發異常。
Java異常類層次結構圖:
java中將程序出現問題封裝成了一個 Throwable 類
Throwable 分兩種:Error(錯誤)和Exception(異常)
Error(錯誤):嚴重問題,指運行時環境發生的錯誤,由jvm自動生成並拋出。例如JVM 內存溢出。
Exception(異常):不嚴重的問題,程序可以處理也必須要處理的(重點)
注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
Exception分兩種:運行期異常和編譯期異常
RuntimeException(運行期異常): 編譯的時候不報錯,運行的時候可能有報錯,可以處理可以不處理
編譯期異常 :除了運行期異常以外,其他全是編譯期異常,必須要處理,否則程序不能通過編譯也就不能運行
2、處理異常機制
異常處理機制爲:拋出異常,捕捉異常。
java.lang.Throwable常用方法:
-
-
Throwable
getCause()
如果原因不存在或未知,則返回此throwable的原因或
null
。String
getLocalizedMessage()
創建此可拋出的本地化描述。
String
getMessage()
返回此throwable的詳細消息字符串。
StackTraceElement[]
getStackTrace()
提供對
printStackTrace()
打印的堆棧跟蹤信息的
-
2.1 捕獲異常:try、catch 和 finally
try{
需要被監測的代碼塊
}catch(異常的名稱 引用名稱){
處理方式
}finally{
無論是否捕獲或處理異常,finally塊裏的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。永遠返回finally中的結果。在以下4種特殊情況下,finally塊不會被執行:
1)在finally語句塊中發生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關閉CPU。
}
執行的流程:當需要被監測的代碼塊中一旦有異常發生,jvm就將該異常封裝成一個異常對象,在傳遞到相應的catch中進行處理
注意:
1.當try中代碼塊一旦有異常發生就直接執行相應catch中代碼,try後面的代碼就不會再執行
2.catch可以有多個,每個catch塊中代碼都可以寫不同的處理方式
3.捕獲異常的時候可以直接捕獲父類異常,但是必須寫在最後一個catch中
4.捕獲異常的時候建議捕獲更具體的異常,這樣處理起來更加具體
try{
int n = 10 / 0;
int[] arr = new int[10];
arr[10] = 100;
}catch(ArithmeticException e){//e=0x1111
System.out.println("除數不能爲0!");
System.out.println(e.getMessage());//打印異常出錯的信息
// e.printStackTrace();//打印異常出錯的詳細信息,異常的名稱,異常的信息,異常出錯的位置
}catch(ArrayIndexOutOfBoundsException e){
System.err.println("索引越界啦!");//紅色的字體輸出
}catch(Exception e){
System.out.println("發生異常了------");
}finally{
System.out.println("finally一定會執行,不信試試!");
}
//結果
除數不能爲0!
/ by zero
finally一定會執行,不信試試!
2.2 、拋出異常:throws/throw 關鍵字
如果一個方法沒有捕獲一個檢查性異常,那麼該方法必須使用 throws 關鍵字來聲明。
throws 關鍵字放在方法簽名的尾部。 異常名稱
throw 關鍵字拋出一個異常對象。
注意:
通過throws來處理異常,並沒有真正的處理異常,僅僅是讓程序通過編譯能夠運行,想真正的處理異常還是得用try...catch
public void deposit(double amount) throws IOException,ArithmeticException {
// Method implementation
throw new RemoteException();
}
定義異常處理時,什麼時候定義try,什麼時候定義throws呢?
功能內部如果出現異常,如果內部可以處理,就用try;
如果功能內部處理不了,就必須聲明出來,讓調用者處理。
3. 自定義異常
在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。一般繼承Exception 類即可。
- 所有異常都必須是 Throwable 的子類。
- 如果寫一個檢查性異常類,則需要繼承 Exception 類。
- 如果寫一個運行時異常類,那麼需要繼承 RuntimeException 類。
class MyException extends Exception{
}
在程序中使用自定義異常類,大體可分爲以下幾個步驟。
(1)創建自定義異常類。
(2)在方法中通過throw關鍵字拋出異常對象。
(3)如果在當前拋出異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作。
(4)在出現異常方法的調用者中捕獲並處理異常。