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、実装されていない場合は例外をスローする必要があります。または、これが実装されている場合は、IllegalStateExceptionnext() を少なくとも 1 回呼び出す前に remove() メソッドを呼び出すと、例外がスローされます。削除する要素がありません (現在の属性は null です)。ここで詳細を確認できます: http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html

さらに、remove() メソッドはNullPointerException、最後の next() メソッドの呼び出し (hasNext() == false) の後に呼び出された場合にスローし、前に述べたように、IllegalStateException

これらはあなたが抱えている問題だと思います。

于 2012-06-26T15:02:27.033 に答える