-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.next而不检查 first 是否为空。在这种情况下,让您的 LinkedList 足够智能以使 deleteFirst 不会抛出 NPE 会很好,这样您就不需要在上层的所有地方进行特殊检查。为此,将 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 回答