【问题标题】:Create an array of Queues in Java在 Java 中创建队列数组
【发布时间】:2012-01-10 21:01:13
【问题描述】:

我正在编写自己的 PriorityQueue 类并且我有:

private Queue<E>[] queues;


public PriorityQueue(int maxSize) {
  queues = new Queue[maxSize+1]; 
  size = maxSize;
}

这可以编译,但是当我在priorityQueue 上调用.add 时出现此错误:

java.lang.NullPointerException
    at PriorityQueue.add(PriorityQueue.java:13)

这里补充一下:

public void add(E item, int priority) {
  queues[priority].offer(item);
}

【问题讨论】:

    标签: java arrays queue


    【解决方案1】:

    您尚未将队列数组初始化为包含任何队列。

    您需要将队列放入数组中。也不确定为什么要添加额外的队列,除非您只是想假装数组不是基于 0 的。

    public PriorityQueue(int maxSize) {
        queues = new Queue<E>[maxSize+1]; 
        for (int i = 0; i < maxSize + 1; i++) {
            queues[i] = new LinkedList<E>(); // Or whatever implementation you're using.
        }
        size = maxSize;
    }
    

    【讨论】:

      【解决方案2】:

      当你这样做时:

       queues = new Queue[maxSize+1]; 
      

      您创建了一个大小为 maxSize+1 的数组,但该数组的每个元素仍然为空。您必须遍历数组并在每个位置放置一个 Queue 对象,然后才能添加到它。

      【讨论】:

        【解决方案3】:

        您创建了一个新数组,但从未将queues 的元素初始化为队列。默认情况下,queues 的所有元素都是null,直到你初始化它们。

        【讨论】:

          【解决方案4】:

          你需要初始化你的队列:

          public PriorityQueue(int maxSize) {
            queues = new Queue[maxSize+1]; 
            size = maxSize;
            for(int i = 0; i <= maxSize; i++) 
              queues[i] = new LinkedList<E>(); 
          }
          

          你可以选择任何你想要的 Queue 实现,我只是选择了 LinkedList 因为它首先出现在我的脑海中......

          【讨论】:

          • 完美。我知道这是一件小事,但它困扰着我。 +1,因为你提供了代码来做到这一点。
          【解决方案5】:

          queues[priority] 返回一个队列,您在该队列上调用 .offer()。因为您没有初始化数组的元素,所以您在空引用上调用 .offer(),这会导致您的错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-09
            相关资源
            最近更新 更多