为什么这个 ArrayListStack 在包含元素时抛出 EmptyStackException?

Why is this ArrayListStack throwing an EmptyStackException when it does contain elements?

我很困惑为什么在将元素推入 ArrayList 时抛出异常...这一定是我的 Push() 方法的问题,有人能找到吗问题?我在 if 语句周围尝试了大括号,但没有成功,甚至可能是 empty() 方法的问题?

这是异常消息:

Exception in thread "main" java.util.EmptyStackException
    at ArrayListStack.push(ArrayListStack.java:35)
    at StackMain.main(StackMain.java:7)

代码:

public class ArrayListStack<E> implements Stack<E> {
    // ArrayList to store items
    private ArrayList<E> list = new ArrayList<E>();

    public ArrayListStack() {
    }

    /**
     * Checks if stack is empty.
     * @return true if stack is empty, false otherwise.
     */
    public boolean empty() {
        return this.size() == 0;
    }

    /**
     * Removes item at top of stack and returns it.
     * @return item at top of stack
     * @throws EmptyStackException
     *             if stack is empty.
     */
    public E push(E x) {
        if (empty())
            throw new EmptyStackException();
        list.add(x);
        return x;
    }

//MAIN METHOD
public class MainStack {

    public static void main(String[] args) {

        ArrayListStack<Character> list = new ArrayListStack<>();
        list.push('A');
        list.push('B');
        list.push('C');
        System.out.print(list);
    }
}

push() 当堆栈为空时不应抛出异常,因为在压入第一个元素之前堆栈将是空的,这很好。

目前您的第一个 push (list.push('A')) 抛出异常,因为堆栈为空。从 push 中删除该条件。如果您的堆栈对元素数量有限制,您应该在 push 中设置条件,如果堆栈已满则抛出异常。

你的

    if (empty())
        throw new EmptyStackException();

检查应移至 pop() 方法。

编辑:您的 push() 方法的 Javadoc 实际上描述了一个 pop() 逻辑,它删除了堆栈顶部的元素并 returns 它。在 pop() 中,您的空白支票是正确的。

顺便说一句,您在 empty() 中也有错误。 this.size() == 0 应该是 list.size() == 0.

因为当您使用代码

将第一个元素放入数组时
list.push('A');

它将抛出该异常,因为那时数组将为空。

理想情况下,您应该在尝试从数组中删除某些元素时抛出此异常,而不是在添加元素时抛出。

 /**
 * Removes item at top of stack and returns it.
 * @return item at top of stack
 * @throws EmptyStackException
 *             if stack is empty.
 */
public E pop() {
    if (empty())
        throw new EmptyStackException();
    E x = list.remove(0);
    return x;
}
/**
 * Add item at bottom of stack.
 */
 public void push(E x) {
    list.add(x);
 }

EmptyStackException 当我们尝试 remove/get 列表中的内容时应该抛出。注意:以上代码不是线程安全的,如果多个线程尝试并行推送和弹出。然后输出与预期不同。