日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java异常处理实验原理_Java异常处理原理与原则

發布時間:2023/12/18 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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异常处理原理与原则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。