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

歡迎訪問 生活随笔!

生活随笔

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

java

Java异常转译(exception translation)的使用

發布時間:2023/12/20 java 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java异常转译(exception translation)的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是異常轉譯(exception translation)

在Java中,我們通常使用try-catch語句捕獲異常,進行異常處理。但有些時候,我們使用try-catch捕獲一個異常,但卻不進行異常處理,反而是拋出另一個異常,這就稱為異常轉譯。如下所示,

try {Method(); //某個會拋出Exception1異常的函數 } catch (Exception1 e) {throw new Exception2(); }

從上述代碼我們很容易理解異常轉譯這個名字的內涵——將異常Exception1轉譯為Exception2。

為什么要進行異常轉譯

第一次看見這樣的代碼可能會產生疑惑——使用try-catch語句通常是用來捕獲異常并進行處理,但上述代碼卻在捕獲異常后又拋出了另一個異常,既然終究會拋出一個異常,那么何必再多此一舉使用try-catch呢?直接拋出Exception1不好嗎?

這樣做的原因是,在某些時候,高層實現和低層異常之間的關系不明顯,直接拋出低層異常會使調用高層實現的客戶端看到異常時不知所措。

下面用JDK的AbstractSequentialList類中的例子解釋上面抽象的描述。
該類中有一個get方法,其具體實現如下

public E get(int index) {ListInterator<E> i = listIterator(index);try {return i.next();} catch (NoSuchElementException e) {throw new IndexOutOfBoundsException("Index: " + index);} }

上述代碼接收一個int型的參數index,返回集合中下標為index的元素。值得注意的是,該函數要求index的值大于等于0,但小于集合中元素的總數。

next()方法的拋出一個NoSuchElementException異常,倘若不使用異常轉譯,調用get方法的客戶端將直接得到一個NoSuchElementException的異常,這樣會使得客戶端對異常產生的原因感到迷惑。通過異常轉譯,使用try-catch捕獲一個NoSuchElementException異常并將其轉換為IndexOutOfBoudsException異常,調用get方法的客戶端看見這個異常,便能很快知道是由于參數index超出了規定的范圍而導致的該異常,一目了然。

一種更加推薦的做法

在上述代碼中,拋出的IndexOutOfBoundsException異常只包含index的信息,一種更加推薦的做法是:

調用構造函數IndexOutOfBoundsException(Throwable cause),將低層的NoSuchElementException異常傳入高層異常IndexOutOfBoundsException。當客戶端調用get方法同時得到一個IndexOutOfBoundsException時,可以調用Throwable的getCause方法得到低層的異常NoSuchElementException。這種保留低層異常的方式能夠為客戶端提供更多的關于異常的信息,方便客戶端找到異常產生的原因。

值得注意的一點

通常我們只使用try-catch捕獲受查異常,但是在異常轉譯中,我們使用try-catch捕獲并轉譯的異常卻沒有這個限制,只要擁有足夠的理由對某個異常進行轉譯,那么即使是RuntimeException,也是可以使用try-catch去捕獲并轉譯的。
(上述例子中轉譯的NoSuchElementException就是一個RuntimeException.)

參考資料

《Effective Java》第三版

總結

以上是生活随笔為你收集整理的Java异常转译(exception translation)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

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