我需要一个类来浏览集合,然后我实现了Iterator接口。 但问题是,我的next()方法的实现需要抛出异常,因为需要动态生成集合成员,并且在生成过程中可能会发生异常。
next()抛出的唯一异常是NoSuchElementException,这意味着集合中没有更多元素,这不符合我的需要。
或者,我根本不应该实现Iterator?
答案 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
,因此避免在方法签名中声明异常。