为什么我会得到这个空指针异常?

时间:2014-11-04 02:57:08

标签: java

所以我得到了这个nullpointerexception。我知道它引起的界限,我只是在查看代码中导致它的原因时遇到了麻烦。

import java.util.*;

public class NoDuplicatesQueueWilson<T> implements NoDuplicatesQueueInterfaceWilson<T>
{
private int MAX_QUEUE = 5; // Default array size, small for testing purposes
private T[] items; // The array of the queue.
private int front; // The first entered item of a queue.
private int back; // The last entered item of a queue.
private int count; // A counter.

public NoDuplicatesQueueWilson() // Default constructor
{
   T [] items = (T[]) new Object[MAX_QUEUE];
   front = 0;
   back = MAX_QUEUE-1;
   count = 0;
}

// Begin Queue Operations
// isEmpty() checks the array to determine if there is an items in it.
public boolean isEmpty()
{
  return count == 0;
}

// isFull() checks to see if the array is full or not.
public boolean isFull()
{
  return count == MAX_QUEUE;
}

// enqueue(Object newItem) adds items to the back of the queue if it is not full.
// If it is full, it will double the size of the array of items,
// and re-create the array, adding the item onto the new array.
public void enqueue(T newItem)   {
  if(!isFull())
  {
     back = (back+1) % (MAX_QUEUE);
     items[back] = newItem;
     ++count;
  }
  else 
  {
     MAX_QUEUE = MAX_QUEUE * 2;
     System.out.println("The array was full. We've doubled the size.");
     T [] items = (T[]) new Object[MAX_QUEUE];
     back = (back+1) % (MAX_QUEUE);
     items[back] = newItem;
     ++count;
  } // End if
} // End Enqueue

当我在我的驱动程序(带有测试数据)中运行它时,异常发生在给定代码的第43行(我的主类包含方法和构造函数),这是在我的enqueue方法的中间。特别是这一行:

items[back] = newItem;

有关我可能需要做什么或想要查看我的错误的建议吗?

2 个答案:

答案 0 :(得分:2)

在构造函数中,您没有初始化T [] items,但是您正在创建新的局部变量。它应该是

public NoDuplicatesQueueWilson() // Default constructor
{
   items = (T[]) new Object[MAX_QUEUE]; // notice the difference
   front = 0;
   back = MAX_QUEUE-1;
   count = 0;
}

修改:另请使用else方法检查enqueue部分代码。

答案 1 :(得分:1)

在构造函数中,此行分配给局部变量,而不是实例变量:

T [] items = (T[]) new Object[MAX_QUEUE];

您可以使用items访问实例变量this.items

this.items = (T[]) new Object[MAX_QUEUE];

您也可以使用items = ...,因为在这种情况下没有歧义。

同样的错误也出现在enqueue(T newItem) T [] items = ...方法中。{/ 1}。