【问题标题】:Null Pointers in my Queue (Link Lists)我的队列中的空指针(链接列表)
【发布时间】:2014-03-27 01:59:04
【问题描述】:

好的,我几乎完成了这个程序,但我现在迷路了。我正在返回空指针(它在第 44 行说,但这只是一个 while 循环),我需要帮助来修复它。我使用一个链表来实现我的队列,而我的其他两个类都通过了 100%,所以最后一个类(CarQueue)是问题所在,即创建空指针。

    public class CarQueue<E> {

    private LinkNode<E> head;
    private LinkNode<E> tail;

    public CarQueue() {
        head = null;
        tail = null;
    }

    public CarQueue(E newData) {
        LinkNode<E> temp = new LinkNode<E>(newData, null);
        head = temp;
        tail = temp;
    }

    public void addToQueue(E newData) {
        LinkNode<E> temp = new LinkNode<E>(newData, null);
        if (empty() == false) {
            tail.setNext(temp);
            tail = temp;
        } else {
            head = temp;
            tail.setNext(temp);
            tail = temp;
        }
    }

    public String toString() {
        LinkNode<E> temp = head;
        String cars = "";
        while (temp.getNext() != null) {
            cars += temp.toString() + '\n';
        }
        return cars;
    }

    public E removeFmQueue() {
        LinkNode<E> headReturn = head;
        head = head.getNext();
        return headReturn.getData();

    }

    public LinkNode<E> peek() {
        return head.getNext();
    }

    public boolean empty() {
        if (head == null)
            return true;
        else
            return false;
    }
}

【问题讨论】:

  • 严格按照我的规范,我被告知要设置一个空构造函数,其中 head 为空,是的,但在我的第二个构造函数中,head 应该是 temp 节点的值。第二个构造函数被设置为好像队列中有一个元素,因此头和尾都是临时的。根据我的测试,当 (temp.getNext() != null) 抛出异常时,getNext 很好,它是在我的 LinkNode 类中设置的,可以完美运行并通过所有测试。我不确定为什么我会得到 null。希望这会有所帮助

标签: java nullpointerexception linked-list queue


【解决方案1】:

如果

while (temp.getNext() != null)  {

是抛出异常的行,然后temp 为空,(或者,如果可能,getNext() 正在抛出 NullPointerException)。但我们假设temp 是问题所在。

temp 被分配给headhead 也被分配给null

如果调用了零参数构造函数,但在调用toString()之前没有调用其他函数,那么这确实会导致temp被分配null。因此,当您尝试temp.getNext() 时,会抛出NullPointerException

为了防止这种情况,您可以让toString() 方法返回一个替代值:

public String toString()  {
   if(head == null)  {
      return  "no head. I got nothing.";
   }

   //print the other stuff...
}

但是,实际上,最好的解决方案是永远不要让 head - 因此 temp - 为空,因为这意味着您的类处于不稳定且基本上无法使用的状态。

防止这种情况最明显的方法是消除零参数构造函数——或者让它用非空值调用另一个构造函数——并确保另一个构造函数从不让 head 保持为空。

【讨论】:

  • 我需要遵循后一种解决方案,但我不知道是什么让我的头为空或我的头应该是什么
  • 我无法删除该构造函数。当我和他一起工作时,我的导师让我这样设置,所以这是我任务的一部分。
  • 再次更新了我的答案。
  • 好的,感谢您的帮助。我会稍微摆弄一下,但我认为问题在于我的临时工,现在我仔细查看了我的代码。 LinkNode temp = new LinkNode(newData, null);我认为这条线是我的问题。我的第一个 NPX 出现在只有在队列为空时才应该使用的条件(在 addToQueue 方法中),所以我将我的头值和尾值分配给 temp,所以 temp 必须为空,但唯一一点我'm setting temp 我将它设置为(newData,null)。我不确定那个 null 到底是做什么的,但这可能是我对 NPX 无处不在的问题
  • 我不能投票,没有足够的“声誉点”之类的。相信我,我试过了哈哈
猜你喜欢
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
相关资源
最近更新 更多