我只是在 eclipse Juno IDE 上用 Java 编写了一个非常简单的“Stack”类,它有 2 个操作 - 推送和弹出。我在 pop() 方法中的一项检查是查看堆栈是否为空;如果是这样,我会抛出 NoSuchElementException。因此,如果我按顺序推送 1、2、3、4、5,然后将元素弹出五次,我希望看到 5、4、3、2、1 以该顺序打印出来。但是在添加五个元素之后,如果我故意尝试将堆栈弹出 6 次,我会期望 5、4、3、2、1,然后是 NoSuchElementException。
在我的情况下发生的事情是控制台随意打印出 NoSuchElementException (即并不总是在打印出 5、4、3、2、1 之后;有时它会打印出:
stack pop: 5
stack pop: 4
Exception in thread "main" java.util.NoSuchElementException: Stack Underflow
stack pop: 3
stack pop: 2
stack pop: 1
at Stack.pop(Stack.java:29)
at Stack.main(Stack.java:47)
有时它会打印出来:
Exception in thread "main" stack pop: 5
stack pop: 4
stack pop: 3
stack pop: 2
stack pop: 1
java.util.NoSuchElementException: Stack Underflow
at Stack.pop(Stack.java:29)
at Stack.main(Stack.java:47)
我的目标是了解是什么支配了这种行为。由于我使用的是打印语句(而不是可能在下面具有类似队列实现的记录器),因此我希望按顺序查看这些语句,但我怀疑这里存在一些并发性。下面是我的代码:
导入 java.util.NoSuchElementException;
public class Stack {
private Node first;
private int size;
private class Node{
Node next;
int value;
}
public Stack(){
size=0;
first=null;
}
public void push(int x){
Node previousFirst = first;
first = new Node();
first.value = x;
first.next = previousFirst;
size++;
}
public int pop(){
if(first == null){
throw new NoSuchElementException("Stack Underflow");
}
int poppedNodeVal = first.value;
first = first.next;
size--;
return poppedNodeVal;
}
public static void main(String[] args) {
Stack stack1 = new Stack();
stack1.push(1);
stack1.push(2);
stack1.push(3);
stack1.push(4);
stack1.push(5);
for(int i=5; i>=0;i--){
System.out.println("stack pop: " + stack1.pop());
}
}
}
关于如何可靠地打印出来的任何想法,更重要的是,什么可能导致控制台中异常的这种不确定性打印?