如何在没有throws子句的接口中实现定义的方法时添加throws Exception子句?

时间:2010-12-15 13:01:25

标签: java exception-handling iterator

我需要一个类来浏览集合,然后我实现了Iterator接口。 但问题是,我的next()方法的实现需要抛出异常,因为需要动态生成集合成员,并且在生成过程中可能会发生异常。

next()抛出的唯一异常是NoSuchElementException,这意味着集合中没有更多元素,这不符合我的需要。

或者,我根本不应该实现Iterator?

3 个答案:

答案 0 :(得分:5)

要迂腐,如果需要添加已检查的异常,则不会实现Iterator.next。 Iterator.next没有抛出任何检查异常,所以基本上Iterator.next有一个合同,没有什么太糟糕可能会出错,用户真的需要考虑(反对,比如File.open,你必须担心IOExceptions被抛出)。

鉴于此,我会按顺序考虑以下选项:

  • 我可以删除已检查的例外并将其替换为未经检查的例外吗?这将是我的第一次尝试,因为经过检查的异常会在每次出现时引起一些激动。这很容易解决您的解决方案,因为您的next()不再抛出已检查的异常。如果它是第三方库,我可以将它包装起来(无论如何这都是个好主意)并将这些异常转换为包装器中的chcked异常?

  • 我可以在迭代器中将异常包装在运行时异常中吗?有一些构造函数可以执行此操作(具有Throwable的构造函数)。这至少会封装您在内部使用的内容,并允许您使用Iterator-interface

  • 我可以用Iterable替换Iterator吗?如果是这样,我可以在创建Iterable期间抛出这些已检查的异常,然后迭代器不会抛出异常。这仅在元素数量不大时才有效。

答案 1 :(得分:1)

您的迭代器可以抛出RuntimeException的子类。这不需要在方法签名中声明。

请注意,NoSuchElementException也是RuntimeException的子类,并且也未在Iterator.next()的方法签名中声明(它仅在javadoc中提及)。

答案 2 :(得分:1)

好吧,如果您的异常是已检查的异常,则无法实现默认java.util.Iterator。一种解决方案可能是扩展java.lang.RuntimeException,因此避免在方法签名中声明异常。