-1

スタックとリンクされたリストを使用してタワー ゲームを解決し、再帰を使用してブロックをタワーからタワーに移動することに取り組んでいます。

java.lang.NullPointerException を引き起こす問題が発生しました。これが起こった理由は、エントリがない場合でもスタックから値をポップしようとしたためだと思います。バインドされたコントロールを配置した後も、そのエラーが発生します。

エラーは deleteFirst() メソッドのある行を指していますが、リストが空かどうかを確認した後でも、なぜこれが発生するのかわかりません。

ここでの私のタスクは、タワーまたは LinkedStack オブジェクトを渡し、それらのコンテンツをタワー ゲームのように移動することだけでした。

エラー:

Exception in thread "main" java.lang.NullPointerException
    at LinkList.deleteFirst(towers.java:47) // code with: **first = first.next;**
    at LinkedStack.pop(towers.java:82) // code with: return theList.deleteFirst();
    at LinkListApp.doTowers(towers.java:146) // code with: A.pop();
    at LinkListApp.doTowers(towers.java:140) // doTowers(a-1, A, C, B);
    at LinkListApp.main(towers.java:121) // doTowers(nDisks, linkA, linkB, linkC);

ここで何が間違っていますか?私はこれを機能させることはできません。あるべきように。

4

1 に答える 1

2

doTowers 呼び出しは A.pop() と C.pop() を呼び出しますが、どちらも保護されていません。LinkedStack は空のチェックなしで直接 theList.deleteFirst() を呼び出し、deleteFirst メソッドはfirst = first.nextfirst が null かどうかをチェックせずに呼び出します。この場合、deleteFirst が NPE をスローしないように LinkedList を十分にスマートにすることをお勧めします。そうすれば、上位層のいたるところで特別なチェックを行う必要がなくなります。これを行うには、deleteFirst を次のように変更します。

public long deleteFirst()
{
    if ( first != null ) {
        Link temp = first;
        first = first.next;
        return temp.dData;
    }
    else {
        return whateverIndicatesTheListIsAlreadyEmptyWhichMayBeHardWithReturnTypelong;
    }
}
于 2012-10-30T18:46:47.277 に答える