如标题中所述,我试图在一些数据上设计一个迭代器,这可能会在某个地方失败。一个例子是Iterator<DatabaseObject>
,在调用next()
时会从DB读取下一行并继续。其他示例可能包括使用API中的对象处理数据以引发异常。问题是如何在这种情况下做出响应,因为Iterator不允许引发任何异常......我们应该抛出NoSUchElementException
并在那里提供有意义的消息吗?
答案 0 :(得分:5)
您可以抛出未经检查的异常。抛出NoSuchElementException
是有意义的,因为事实上,一个错误阻止了它成为这样一个元素。
如果异常将包装任何底层异常,那将是很好的。不幸的是,NoSuchElementException
没有带有另一个异常的构造函数。因此,如果您想要传播根本原因,则必须采用不同的路线,例如抛出RuntimeException
:
try {
...
} catch (<some exception type> e) {
throw new RuntimeException("Next element not accessible", e);
}
或者,您可以返回一些保留值(例如null
)。
答案 1 :(得分:0)
我认为这取决于你想如何处理错误。 也许您想要读取hasNext()中的下一个条目,因此您可以在出现问题时返回false。 从客户的角度考虑它。 客户应该如何反应?
答案 2 :(得分:0)
我见过的大多数试图制作“可能失败的迭代器”的API实际上最终工作得非常糟糕。我强烈建议您不要使用Iterator
。