为什么这段代码在java中有NullPointerException?

时间:2014-11-12 17:48:17

标签: nullpointerexception

我是java新手。

以下代码有NullPointerException,我真的不知道发生了什么。好像我试图访问空指针。但我不知道我在哪里访问空指针。 (如果它是“head”节点部分,我认为我在这段代码中没有使用它的对象槽。)

非常感谢!

 class Deque<Base>
{
   private class Node
 {
    private Base object;
    private Node right;  //point to the front Node
    private Node left;  //Point to the rear Node
    //Constrcutor for Node
    private Node(Base object, Node left, Node right)
    {
        this.object = object;
        this.left = left;
        this.right = right;
    }
}

private Node head;
//Constructor for Deque
public Deque()
{
    head = new Node(null,head,head);
}
//--------------------------------------
public void enqueueFront(Base object)
{

    head.right = new Node(object, head, head.right);
    head.right.right.left = head.right;
    //Node temp = head.right;
    //temp.left = head.right.right;
}
//--------------------------------------------
public void enqueueRear(Base object)
{
    //Node temp = head.left;
    head.left = new Node(object, head.left, head);
    //temp.right = head.left;
    head.left.left.right = head.left;
}
//------------------------------------------------
public Base dequeueFront()
{
    if (isEmpty()) 
    {
        throw new IllegalStateException();
    }
    else 
    {
        Base a = head.right.object;
        Node temp = head.right.right;
        temp.left = head;
        head.right = temp;
        return a;
    }
}
//---------------------------------------------------
public Base dequeueRear()
{
    if (isEmpty()) 
    {
        throw new IllegalStateException();
    }
    else 
    {
        Base b = head.left.object;
        Node temp = head.left.left;
        temp.right = head;
        head.left = temp;
        return b;
    }
}
//----------------------------------------------------
public boolean isEmpty()
{
    return ((head.left == head)&&(head.right == head));
}
}

class Driver10 
{ 
  public static void main(String [] args) 
  { 
    Deque<Integer> a = new  Deque<Integer>(); 
    //int temp;

    //a.dequeueFront(); 
    a.enqueueFront(2);
//a.enqueueFront(3);
//a.enqueueFront(4);
//a.enqueueRear(6);
//a.enqueueRear(7);
//front: 4,3,2  
//rear: 7,6
 //temp = a.dequeueRear();


   // System.out.println(temp);   //  7 
   //System.out.println(a.dequeueRear()); // 6
   //System.out.println(a.dequeueRear()); // 2
//System.out.println(a.dequeueFront());  //4
//System.out.println(a.dequeueRear()); // 3
//a.dequeueRear();
  } 
}

2 个答案:

答案 0 :(得分:0)

这句话看起来很可疑:

head.right.right.left = head.right;

在代码尝试访问其head.right.right成员时,left看起来可能不是null。

在尝试分配给head.right.right

之前,您似乎需要将新节点分配给head.right.right.left

答案 1 :(得分:0)

多个问题:

最相关的是:

head = new Node(null,head,head);

当您实例化Dequeue时,您将右侧和左侧的默认值指定为null,因为head为null。因此,将右侧和左侧分配为null,您将节点分配给头部。

发布您尝试将元素排入队列并尝试:

head.right = new Node(object, head, head.right);
head.right.right.left = head.right;

这里你正在设置为新节点但是看到head.right仍为null,如上所述。发布此声明您的队列中包含正确的元素(现在恰到好处)就像:

 head -> node -> null

然后你做

head.right.right.left = head.right;

这里你有一个有效的node.right,但是node.right.right如上所述为null,你试图访问left for null,这是你得到NullPointerException的地方。

您可能需要调试并确定是否需要以下内容:

head.right.left = head.right;