这是我作业的一部分,因为我无法理解,我以为我会在这里试试。
我正在尝试使用堆栈在BST上实现迭代器。我编译并正确运行,结果似乎也是正确的。
然而,当我尝试使用我学校的自动标记时,它允许我提交代码,系统将使用其模型进行检查。在运行迭代器时出现以下错误:
!分析暂停:您的代码输出错误,失败 抛出一个异常,或者在它不应该抛出异常时抛出异常。
java.lang.Exception:您的代码产生了错误的输出, 未能抛出异常,或者抛出异常 不应该。在LabProject.main(LabProject.java:115)
我很确定(正如它所说的)我在下面的实现中某处抛出异常时遇到了麻烦,或者我错过了在某些方面抛出它们。我已经多次检查过,似乎无法做到正确。有人能看到我需要做什么吗?
以下是代码:
public class DictionaryItr<E extends Comparable<E>> implements Iterable<E> {
private MyNode first; // top of stack
public int modCount = 0;
// helper linked list class
private class MyNode {
private E item;
private MyNode next;
}
public DictionaryItr(DictionaryImp.DictNode root) {
first = null;
this.loadNodes(root);
}
@SuppressWarnings("unchecked")
public void loadNodes(DictionaryImp.DictNode node) {
if (node != null) {
loadNodes(node.right);
this.push((E)node.value);
loadNodes(node.left);
}
}
public boolean isEmpty() {
return first == null;
}
public void push(E item) {
MyNode oldfirst = first;
first = new MyNode();
first.item = item;
first.next = oldfirst;
modCount++;
}
public E pop() {
if (isEmpty()) throw new RuntimeException("Stack underflow");
E item = first.item;
first = first.next;
return item;
}
public E peek() {
if (isEmpty()) throw new RuntimeException("Stack underflow");
return first.item;
}
public Iterator<E> iterator() {
return new ListIterator();
}
private class ListIterator implements Iterator<E> {
private MyNode current = first;
private int expectedModCount;
public ListIterator() {
expectedModCount = modCount;
}
public boolean hasNext() {
return current != null;
}
public void remove() {
current = current.next;
}
public E next() {
if (modCount != expectedModCount) throw new ConcurrentModificationException();
if (!hasNext()) throw new NoSuchElementException("No more elements");
else {
E item = current.item;
current = current.next;
return item;
}
}
}
}
答案 0 :(得分:0)
如果没有实现,remove方法必须抛出异常UnsupportedOperationException
,或者,这是你的情况,如果它被实现,如果你调用remove(),它将抛出IllegalStateException
在调用next()之前至少调用一次,或者如果没有要删除的元素(当前属性为null)。您可以在此处查看详细信息:http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html
此外,如果在最后一个next()方法调用(hasNext()== false)之后调用remove()方法将抛出NullPointerException
,并且如前所述,它必须抛出{{ 1}}
我认为这些是你遇到的问题。