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

时间:2016-04-03 05:31:00

标签: java exception arraylist stack throw

我很困惑,为什么当我将元素推入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);
    }
}

3 个答案:

答案 0 :(得分:1)

当堆栈为空时,

push()不应抛出异常,因为在推送第一个元素之前它将为空,这很好。

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

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

检查应移至pop()方法。

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

顺便说一下,empty()也有错误。 this.size() == 0应为list.size() == 0

答案 1 :(得分:1)

因为您使用代码

将第一个元素放入数组中的那一刻
list.push('A');

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

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

答案 2 :(得分:0)

 /**
 * 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);
 }

当我们尝试从List中删除/获取某些内容时,应该抛出EmptyStackException。注意:如果多个线程尝试并行推送和弹出,则上面的代码不是线程安全的。然后输出与预期不同。