为什么在迭代器引发 NoSuchElementException 并停止循环执行时不考虑 foreach 循环?
让我解释。
通常迭代器需要提供两个重要的方法:hasNext 和 next。如果没有更多元素要迭代,则下一个方法可以引发 NoSuchElementException。hasNext 方法更像是一种语法糖,只是为了让你的代码更好一点。重要的方法实际上是 next ,这是应该做任何工作的方法,如果有的话,但不是 hasNext ,它需要在没有预先调用 hasNext 的假设的情况下实现。
假设我们有以下情况:
final Iterator<String> bogusIt01 = new Iterator<String>() {
public boolean hasNext() {
return true;
}
public String next() {
throw new NoSuchElementException("no such element");
}
public void remove() {
throw new UnsupportedOperationException("cannot remove element");
}
};
final Iterable<String> bogusPr01 = new Iterable<String>() {
public Iterator<String> iterator() {
return bogusIt01;
}
};
for (@SuppressWarnings("unused") String string:bogusPr01) {
// pass
}
这将引发 NoSuchElementException。我希望循环只是终止。我做错了吗?
我问的原因是因为使用这个模型很难编写一个迭代器来包裹另一个迭代器并对其输出进行一些处理。让我们想象以下场景:
Iterator1 <- 这是我们原来的迭代器,一切都很好。
Iterator2 <- 此迭代器环绕 Iterator1 并修改迭代元素的输出。
Iterator2 是这样实现的:
public boolean hasNext() {
return iterator1.hasNext();
}
public Object next() {
if (!iterator1.hasNext()) {
throw new NoSuchElementException("no such element");
}
Object nextValue = iterator1.next();
try {
// do something that could raise exception
} catch (Exception e) {
return this.next();
}
return productValue;
}
public void remove() {
throw new UnsupportedOperationException("cannot remove element");
}
这样的设计根本不可能,尽管它对我来说很有意义。
有一个更好的方法吗?