2010-12-15 22 views
3

我需要一個類來瀏覽集合,然後我實現了Iterator接口。 但問題是,我的next()方法的實現需要拋出一個異常,因爲集合成員需要動態生成,異常可能發生在生成過程中。如何在不帶throws子句的實現接口中定義的方法時添加throws Exception子句?

next()拋出的唯一異常是NoSuchElementException,這意味着集合中沒有更多的元素,這不符合我的需要。

或者,我不應該實現迭代器?

回答

5

如果您需要添加一個檢查的異常,那麼您就沒有實現Iterator.next。 Iterator.next不會拋出檢查異常,所以基本上Iterator.next具有合同,沒有什麼太壞可能會出錯用戶真的需要考慮(反對,比如File.open,你必須擔心拋出IOExceptions)。

鑑於這種情況,我會考慮下面的選項,按順序:

  • 我可以刪除的checked異常,並與unchecked異常取代他們?這將是我的第一次嘗試,因爲每次出現時,檢查的異常都會引起相當大的騷動。這很容易解決你的解決方案,因爲你的next()不會再拋出檢查過的異常。如果它是第三方庫,我可以包裝它嗎(無論如何,這將是一個好主意),並將這些異常轉換爲包裝中的chcked異常?

  • 我可以將異常包裝在迭代器中的運行時異常中嗎?有構造函數來做這件事(那些帶Throwable的)。這至少會封裝你在內部使用的內容,並允許你使用Iterator接口我可以用Iterable替換我的Iterator嗎?如果是這樣,我可以在創建Iterable期間拋出這些檢查過的異常,然後迭代器不能拋出異常。這隻有在元素數量不是很大時纔有效。

+0

謝謝泰莎,你的回答非常有幫助!我不明白的是,爲什麼你說我沒有實現迭代器?在這種情況下,我可以說我真的在實現一個接口? – chance 2010-12-15 13:25:23

+0

@ wang.chance:他說*你沒有實現iterator.next「如果」你需要添加一個檢查的異常*。我認爲他試圖闡明的一點是,檢查異常也是我們稱之爲接口或合同的一部分;如果你拋出一個不屬於合同一部分的檢查異常,你就會使合同無效。 – 2010-12-15 14:55:01

1

您的迭代器可以拋出RuntimeException的子類。這不需要在方法簽名中聲明。

請注意,NoSuchElementException也是RuntimeException的子類,也沒有在方法簽名Iterator.next()(它只在javadoc中提到)中聲明。

1

那麼,如果你的異常是一個檢查異常,你不能實現默認java.util.Iterator。一種解決方案可能是擴展java.lang.RuntimeException,因此避免在方法簽名中聲明異常。

相關問題