实现迭代器在抛出异常时出错

时间:2012-05-30 08:01:02

标签: java exception stack binary-search-tree

这是我作业的一部分,因为我无法理解,我以为我会在这里试试。

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

1 个答案:

答案 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}}

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