我很困惑,为什么当我将元素推入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);
}
}
答案 0 :(得分:1)
push()
不应抛出异常,因为在推送第一个元素之前它将为空,这很好。
目前您的第一个push
(list.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。注意:如果多个线程尝试并行推送和弹出,则上面的代码不是线程安全的。然后输出与预期不同。