1

私は取得しています

Exception in thread "main" java.lang.NullPointerException
    at datastructuresPart2.LinkedStack.pop(LinkedStack.java:20)
    at tests.StackTest.main(StackTest.java:66)

リンクされたスタックを実装しようとするとき。ほぼ同じコードが別のプロジェクトで機能するため、何が起こっているのかわかりません。関連するすべてのコードを投稿します。(配列として正常に実行しました。しかし、リンクされたリストを使用する必要があります...)

package datastructuresPart2;

import datastructuresPart2.Node;

public class LinkedStack<E> extends AbstractCollection<E> implements Stack<E> {


    private Node<E> top = null;

    @Override
    public void push(E element) {
        top = new Node<E>(element, top);
        size++;     
    }

    @Override
    public E pop() {
        if (isEmpty())
            throw new EmptyCollectionException("empty stack");
        E element = top.data;
        top = top.next;
        size--;
        return element;
        }

    @Override
    public E top() {
        if (isEmpty())
            throw new EmptyCollectionException("empty stack");
        return top.data;
    }

    @Override 
    public void clear() {
        super.clear();
        top = null;
    }

    public boolean contains(E element) {
        for (Node<E> current = top; current != null; current = current.next) 
            if (element.equals(current.data))
                return true;
        return false;
    }

    // Returns a string representation for this collection.
        @Override
        public String toString() {
            String buffer = "[";
            if (! isEmpty()) {
                buffer += top.data;
                for (Node<E> current = top.next; current != null; current = current.next)
                    buffer += ", " + current.data;
            }
            return buffer + "]";
        }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;

        if (getClass() != obj.getClass())
            return false;

        @SuppressWarnings("unchecked")
        LinkedStack<E> other = (LinkedStack<E>) obj;



        int count = 0;
        for (Node<E> trav = other.top; trav != null; trav = trav.next){

            if (top.getData().equals(trav.getData())) {
                count++;    
            }

            top = top.getNext();
        }

        if (count == size)
            return true;
        else
            return false;
    }
}

私も使用します:

/*
 * StackTest.java
 * This source file contains a class that tests the Stack interface and
 * implementation.
 */

package tests;

import datastructuresPart2.*;

public class StackTest {

    // Serves as the entry point for this application.
    public static void main(String[] args) {
        Stack<String> stk = new LinkedStack<>();
        Stack<String> stk2 = new LinkedStack<>();


        System.out.println("After creating a new stack...");
        CollectionTest.print(stk);
        System.out.println();

        stk.push("cat");
        stk.push("dog");
        stk.push("tree");
        stk.push("house");
        stk.push("boat");
        stk.push("woman");
        stk.push("man");
        stk.push("car");
        stk.push("pool");
        stk.push("motorcycle");
        stk.push("mailbox");

        System.out.println("After adding some elements...");
        CollectionTest.print(stk);
        System.out.println();

        System.out.println("After creating a new stack2...");
        CollectionTest.print(stk2);
        System.out.println();

        stk2.push("cat");
        stk2.push("dog");
        stk2.push("tree");
        stk2.push("house");
        stk2.push("boat");
        stk2.push("woman");
        stk2.push("man");
        stk2.push("car");
        stk2.push("pool");
        stk2.push("motorcycle");
        stk2.push("mailbox");

        System.out.println("The top element is " + stk.top());
        System.out.println("Does it contains a man? " + stk.contains("man"));
        System.out.println();

        System.out.println("Are the stacks equal? " + stk.equals(stk2));

//      System.out.println("Traversing the stack...");
//      for (String element : stk)
//          System.out.println(element);
//      System.out.println();

        System.out.println("Removing: " + stk.pop());
        System.out.println("Removing: " + stk.pop());

        System.out.println("After removing the top two elements...");
        CollectionTest.print(stk);
        System.out.println();

        System.out.println("Are the stacks equal? " + stk.equals(stk2));
        System.out.println();

        System.out.println("The top element is " + stk.top());
        System.out.println("Does it contains a man? " + stk.contains("man"));
        System.out.println();

        stk.clear();
        System.out.println("After clearing the stack...");
        CollectionTest.print(stk);
        System.out.println();

        System.out.println("Trying to get the top element...");
        try {
            System.out.println("The top element is " + stk.top());
        }
        catch (EmptyCollectionException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

}

どんな助けでも大歓迎です!

編集:

Node.java

package datastructuresPart2;

public class Node<T> {

    T data;
    Node<T> next;

    public Node(T data, Node<T> next) {
        this.data = data;
        this.next = next;
    }

    public T getData() { return data; }
    public void setData(T data) { this.data = data; }
    public Node<T> getNext() { return next; }
    public void setNext(Node<T> next) { this.next = next; }

    @Override
    public String toString() {
        return data + "--->" + next; //recursion implicita
    }



}

AbstractCollection.java

package datastructuresPart2;

public abstract class AbstractCollection<E> implements Collection<E> {

    protected int size = 0;

    @Override
    public int size() { return size; }

    @Override 
    public void clear() { size = 0; }

    @Override
    public boolean isEmpty() { return (size == 0); }

    @Override public abstract boolean contains(E element);
    @Override public abstract String toString();
    @Override public abstract boolean equals(Object obj);



}

編集:そしてCollection.java ...全体を入れてもいいかもしれません笑。

package datastructuresPart2;

public interface Collection<E> {

    int size();

    boolean isEmpty();

    boolean contains(E element);

    void clear();



}
4

1 に答える 1

1

equals()あなたの実装がおそらくあなたが望むものではないスタックの状態を変更しているため、これが起こっていると確信しています。失敗しequals()ている回線の前に呼び出します。pop()

ここ:

for (Node<E> trav = other.top; trav != null; trav = trav.next){

    if (top.getData().equals(trav.getData())) {
        count++;    
    }

    top = top.getNext();
}

の値を変更してtopおり、スタック全体をトラバースするとtop、この関数呼び出しの最後に null になります。equals()オブジェクトの状態を変更しないように書き直してください。

また、おそらく実装で設定size = 0するclear()か、オーバーライドisEmpty()して、どちらがより堅牢な空のチェックであるかを確認する必要top==nullがあります(たとえば、ここではnullポインターではなく「スタックが空です」と表示されると思います)。

于 2013-04-07T04:37:18.703 に答える