1 概述
Java程序在運行過程中出現的錯誤,如除數爲零、空指針、數組越界等
2 分類
Throwable:異常類的父類
Error:極其嚴重的問題,如內存溢出,我們不作處理
Exception
RuntimeException:運行時異常,一般是代碼不夠嚴謹導致,需要修改代碼,所以也不處理
編譯是異常:Exception 中除去 RuntimeException 部分,必須處理,因爲不處理不能通過編譯。
3 異常處理
如果我們沒有處理異常,JVM 會做出默認處理:將異常名稱、原因及出現的問題輸出在控制檯,並結束程序。
處理格式:
JDK7 以前
注意:
try{} 中的代碼越少越好,儘可能明確 catch 中的異常類型,如果實在不清楚,可以用父類替代,並且輩分越高的異常越放在後面。
catch(Exception e){} 中必須有內容,即便是一個提示消息
當 try{} 中有多個異常時,一旦異常出現,出現異常後面的代碼將不會被執行
JDK7 以後
注意:
該代碼雖然簡潔,但是不同的異常處理卻是相同的,而且各個異常必須是同輩的異常
即便是try和catch中有return語句,finally中的語句也會被執行
如圖中代碼所示
當程序執行到 catch 中 return a 時,就已經形成了return 30 的返回路徑。但因爲有 finally,所以程序會跳轉到 finally 並執行,等待 finally 中的語句執行完畢後在執行 return 30。
4 異常聲明和拋出
- 聲明異常
使用 throws 關鍵字在方法後面聲明拋出異常
注意:
throws 必須跟在方法後面,並且可以聲明拋出多個異常,用 "," 隔開即可。
儘量不要在main()上聲明拋出異常
- 拋出異常
格式:throw 異常對象
例: throw new Exception("拋出一個異常");
5 throw 和 throws 的區別
- throw
用在方法體內,跟的是異常對象
只能拋出一個異常對象
表示拋出一個異常,由方法體內的語句處理
執行throw一定拋出了某種異常
- throws
用在方法聲明後面,跟的是異常類名,可以多個異常類名,用逗號隔開,表示方法可能拋出異常,由方法的調用者處理
執行throws表示可能出現異常,但不一定會發生
- 注意
子類重寫父類方法時,子類的方法只能拋出父類方法聲明的異常或其子異常
父類方法如果聲明拋出多個異常,子類重寫方法聲明拋出的異常只能是父類方法聲明拋出異常的子集
如果父類方法沒有聲明拋出異常,那麼子類也不能聲明拋出異常