Java异常处理实验原理_Java异常处理原理与原则
一、Exception和Error的區別
在Java中我們可以這樣區分,異常(Exception)是一種非程序原因的操作失敗(Failure),而錯誤(Error)則意味著程序有缺陷(Bug)。
二、Java的類繼承體系非常清楚地區分了Exception和Error
java.lang.Object
java.lang.Throwable
java.lang.Error
java.lang.Exception
一般情況下不應該嘗試用catch(Throwable)或者catch(Error)去捕獲Error。
三、聲明異常和未聲明異常的區別
1、從本質上將:在方法簽名上聲明的異常屬于方法接口的一部分,它和方法的返回值處于同一抽象層次,不隨具體實現的變化而改變。
在方法簽名上聲明要拋出的異常,屬于這個方法接口層面的一種失敗情況,簡答的說就是,不管方法的內部采用什么實現,都必然存在方法內部產生方法簽名上聲明的異常的情況,所以這時把這個異常聲明出來就非常合理。
2、下面有個相反的例子:
從帳戶a向帳戶b轉賬的transfer方法:
public?boolean?transfer(Account?a,?Account?b,?Money?money)?throws?SQLException
它拋出SQLException就不對了,因為SQLException不屬于這個transfer接口層面的概念,而屬于具體實現,很有可能未來某個實現不用SQL了那么這個異常也就不存在了。這種情況下,就應該捕獲SQLException,然后拋出自定義異常TransferException,其中TransferException可以定義幾種和業務相關的典型錯誤情況,比如金額不足,帳戶失效,通信故障,同時它還可以引用SQLException作為觸發原因(Cause)。
public?boolean?transfer(Account?a,?Account?b,?Money?money)?throws?TransferException?{
try?{
...
executeSQL(...);
}?catch?(SQLException?e)?{
throw?new?TransferException("...",?e);
}
}
對上面這個反例的總結:
如果一個異常不屬于方法接口層面,而與方法內部的具體實現相關,很有可能在未來某個實現不會產生這種異常,在這種情況下,就應該在方法內部實現中拋出這種異常。
3、簡單的總結聲明異常和未聲明異常的區別:
1.聲明異常:
在方法簽名上拋出的;
屬于方法接口層面,和方法內部的具體實現沒有相關。
2.未聲明異常:
在方法內部實現中拋出的;
與方法的具體實現相關,有可能隨著不同實現而出現或消失。
4、什么情況下方法應該拋出未聲明的異常?
拋出未聲明異常表示遇到了和具體實現相關的運行時錯誤,它不是在設計時就考慮到的方法接口的一部分。
四、如何捕獲其它方法拋出的異常
下面例子中方法g聲明了GException,方法f聲明了FException,而f在調用g的時候不管三七二十一通過catch?(Exception?e)捕獲了所有的異常。
void?g()?throws?GException
void?f()?throws?FException?{
try?{
g();
}?catch?(Exception?e)?{
...
}
....
}
這種做法是很多人的習慣性寫法,但這種寫法是有問題的。問題在于g明明已經告訴你除了GException外,如果拋出未聲明的RuntimeException就表示遇到了錯誤,很可能是程序有Bug,這時f還不顧一切繼續帶著Bug跑。所以,除非有特殊理由,對具體情況做了分析判斷,一般不捕獲未聲明異常,讓它直接拋出;只捕獲其它方法的聲明異常。
優雅的處理辦法應該像下面這樣:
void?g()?throws?GException
void?f()?throws?FException?{
try?{
g();
}?catch?(GException?e)?{
...
}
....
}
五、Exception和RuntimeException的區別
Java中區分Checked?Exception和Unchecked?Exception,前者繼承于Exception,后者繼承于RuntimeException。Unchecked?Exception和Runtime?Exception在Java中常常是指同一個意思。
Java編譯器對Checked?Exception的約束包括兩方面:
1.對于方法編寫者來講,Checked?Exception必須在方法簽名上聲明;
2.對于方法調用者來講,調用拋出Checked?Exception的方法必須用try-catch捕獲異常或者繼續聲明拋出。
相反,Unchecked?Exception則不需要顯式聲明,也不強制捕獲。
六、自定義異常應繼承Exception還是RuntimeException?
對于自己編寫的異常類來講,推薦默認的是繼承RuntimeException,除非有特殊理由才繼承Exception。
這種推薦的做法的設計理念:把是否捕獲和何時捕獲這個問題交給使用者決定,不強制使用者。
當然,如果某些情況下明確提醒捕獲更加重要還是可以采用Checked?Exception的。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java异常处理实验原理_Java异常处理原理与原则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 手动事务回滚_JAVA设置手动
- 下一篇: java日期格式精确到分_详解Java日