プッシュとポップの2つの操作を持つEclipse Juno IDEで、Javaで非常に単純な「スタック」クラスを作成していました。pop() メソッドで行うチェックの 1 つは、スタックが空かどうかを確認することです。その場合、NoSuchElementException をスローします。したがって、1、2、3、4、5 を順番にプッシュしてから要素を 5 回ポップすると、5、4、3、2、1 がその順序で出力されることが期待されます。しかし、5 つの要素を追加した後、意図的にスタックを 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)
私の目標は、何がこの行動を支配しているのかを理解することです。私は print ステートメントを使用しているので (下にキューのような実装があるロガーではありません)、ステートメントが順番に表示されることを期待しますが、ここでいくつかの並行処理が行われているのではないかと思います。以下は私のコードです:
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());
}
}
}
これを確実に出力する方法と、さらに重要なことに、コンソールでのこの非決定論的な例外の出力の原因は何ですか?