1

这是我家庭作业的一部分,因为我想不通,所以我想我会试着在这里问。

我正在尝试使用堆栈在 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;
            }
        }
    }
}
4

1 回答 1

0

如果未实现remove 方法,则必须抛出异常UnsupportedOperationException,或者,这是您的情况,如果已实现,IllegalStateException如果您在调用 next() 之前调用 remove() 方法至少一次,或者如果您没有要删除的元素(当前属性为空)。您可以在此处查看详细信息:http: //docs.oracle.com/javase/6/docs/api/java/util/Iterator.html

此外,remove() 方法将NullPointerException在最后一次调用 next() 方法之后抛出一个 if (hasNext() == false),并且如前所述,它必须抛出一个IllegalStateException

我认为这些是你遇到的问题。

于 2012-06-26T15:02:27.033 回答