程序的問題
- 嚴重問題:Error,比如內(nèi)存溢出,不處理,因為沒辦法處理
- 問題:Exception
- 編譯期問題 不是RuntimeException異常,必須處理,否則編譯無法通過
- 運行期問題 RuntimeException,不處理,因為代碼不夠嚴謹,需要修正代碼
處理方案
try...catch...finally
try{
可能出現(xiàn)問題的代碼;
}catch(異常名 變量){
針對問題的處理;
}finally{
釋放資源;
}
變形格式:
try{
可能出現(xiàn)問題的代碼;
}finally{
釋放資源;
}//為了釋放資源,異常沒有處理
finally:被finally控制的語句一定會執(zhí)行,除非之前JVM退出了。用于釋放資源,在IO流或數(shù)據(jù)庫中可以經(jīng)常見到
如果catch里有return語句,finally的語句會在return語句前執(zhí)行
變形格式:
try{
可能出現(xiàn)問題的代碼;
}catch(異常名 變量){
針對問題的處理;
}
注意: 1. try中的代碼越少越好
2. catch中必須有東西
3. 若不明確異常類型,可以用Exception或父類異常來接受,且父類異常需放在最后
代碼形式:1. 有幾個異常,寫幾個try...catch
2. 寫一個try,多個catch 此方法一旦在try中有問題,會在catch中匹配異常,有匹配的話執(zhí)行catch中的代碼并結(jié)束
-JDK7的新特性
try{
可能出現(xiàn)問題的代碼;
}catch(異常名1 |異常名2 ... 變量){//異常必須是同級的
針對問題的處理;
}
throws
格式: throws 異常類名... (必須跟在方法的括號后面)
注意:-盡量不要在main方法上拋出異常
- 若拋出的是運行期異常,可以不處理,如果是編譯期異常,必須處理
throw
在方法內(nèi)部拋出異常對象 throw new 異常類名();
用戶自定義異常
繼承Exception
繼承RuntimeException
- 只需寫構(gòu)造方法
注意事項:
1.子類重寫父類方法時,子類拋出的異常必須和父類相同或是父類異常的子類異常
2.父類拋出多個異常時,子類不能拋出父類沒有的異常
3.子類重寫的方法沒有拋出異常,子類的方法也不能拋出,只能用try...catch...解決
throws和throw的區(qū)別
throws:跟在方法的括號后面,可拋出多個異常,由方法調(diào)用者處理異常,表示可能發(fā)生異常,不一定發(fā)生異常
throw: 在方法體內(nèi),只能拋出一個異常,由方法體內(nèi)處理,一定拋出了一個異常
異常中需要了解的方法
1.public String getMessage() 異常的消息字符串
2.public String toString() 返回異常的簡單信息,類的 name(路徑名) + “: ” + getLocalizedMessage()方法的結(jié)果(默認返回getMesage())
3.public void printStackTrace() 獲取異常的信息及位置,返回void,把信息輸出到控制臺
異常處理原則
- 能處理用try{}catch{},后續(xù)程序可以運行
- 不能處理用throws,后續(xù)程序不能運行