【问题标题】:Java - Iterator that might failJava - 可能失败的迭代器
【发布时间】:2012-11-14 06:24:29
【问题描述】:
如标题中所述,我正在尝试针对某些数据设计一个迭代器,这可能会在某处失败。一个示例是 Iterator<DatabaseObject>,它会在调用 next() 时从 DB 读取下一行并继续。其他示例可能包括使用引发异常的 API 对象处理数据。问题是在这种情况下如何响应,因为不允许迭代器引发任何异常......我们应该抛出NoSUchElementException 并在那里提供有意义的消息吗?
【问题讨论】:
标签:
java
exception
iterator
【解决方案1】:
您可以抛出未经检查的异常。抛出NoSuchElementException 是有意义的,因为事实上,一个错误阻止了这样一个元素的出现。
如果异常可以包装任何底层异常,那就太好了。不幸的是,NoSuchElementException 没有接受另一个异常的构造函数。因此,如果您想将根本原因向上传播,则必须走另一条路,例如抛出RuntimeException:
try {
...
} catch (<some exception type> e) {
throw new RuntimeException("Next element not accessible", e);
}
或者,您可以返回一些保留值(例如null)。
【解决方案2】:
我认为这取决于您要如何处理错误。
也许您想阅读 hasNext() 中已经存在的下一个条目,以便在出现问题时返回 false。
从客户的角度考虑。
客户应该如何反应?
【解决方案3】:
我见过的大多数 API 都试图制造“可能失败的迭代器”,但最终结果却很糟糕。我强烈建议您不要为此使用Iterator。