【问题标题】:checking if array is empty without getting NullPointerException检查数组是否为空而不获取 NullPointerException
【发布时间】:2020-02-28 20:18:06
【问题描述】:

我在检查数组是否为空时收到 NullPointerException 错误。当数组为空时,它应该返回 null,但我找不到它为什么不工作的原因。关于我做错了什么的任何提示?这是我的完整代码:

import java.lang.reflect.Array;

public class EventPriorityQueue {

    class Node {
        Event event;
        int priority;

        Node(Event event, int priority) {
            this.event = event;
            this.priority = priority;
        }
    }

    private int size;
    private Node[] array;

    public EventPriorityQueue() {
        this.size = 0;
        array = new Node[20];
    }

    public int size() {
        return size;
    }

    public void insert(Event event, int priority) {
        if (size == 0) {
            array[0] = new Node(event, priority);
            size++;
            return;
        }
        if (size == array.length) {
            Node[] array2 = new Node[size*2];
            System.arraycopy(array, 0, array2, 0, array.length);
            array = array2;
        }
        if (size > 0) {
            array[size] = new Node(event, priority);
            size++;
            percolateUp(size - 1);
        }
    }

    private void percolateUp(int index){
        int parentIndex = (index - 1) / 2;
        while (array[index].priority < array[parentIndex].priority) {
            Node temp = array[parentIndex];
            array[parentIndex] = array[index];
            array[index] = temp;
            index = parentIndex;
            parentIndex = (index - 1) / 2;
        }
    }

    public Event peek() {
        return array[0].event;
    }

    public Event poll() {
        if (array[0] == null) {
            return null;
        }
        Node deletedElement = array[0];
        array[0] = array[size - 1];
        array[size - 1] = null;
        size--;
        percolateDown(0);
        return deletedElement.event;
    }

    private void percolateDown(int index) {
        int smallest = index;
        int rightChildIndex = (index * 2) + 2;
        int leftChildIndex = (index * 2) + 1;
        if (array[leftChildIndex] != null) {
            if (array[leftChildIndex].priority < array[smallest].priority) {
                smallest = leftChildIndex;
            }
        }
        if (array[rightChildIndex] != null) {
            if (array[rightChildIndex].priority < array[smallest].priority) {
                smallest = rightChildIndex;
            }
        }
        if (smallest != index) {
            Node temp = array[index];
            array[index] = array[smallest];
            array[smallest] = temp;
            index = smallest;
            percolateDown(smallest);
        }

    }

    public int[] toPrioritiesArray() {
        // DO NOT CHANGE THIS FUNCTION
        int[] result = new int[this.size];
        for (int i = 0; i < this.size; i++) {
            result[i] = this.array[i].priority;
        }
        return result;
    }

    public static boolean checkHeapProperty(int[] priorities) {
        for (int i = 0; i < priorities.length; i++) {
            if (2 * i + 1 < priorities.length && priorities[i] > priorities[2 * i + 1]) {
                return false;
            }
            if (2 * i + 2 < priorities.length && priorities[i] > priorities[2 * i + 2]) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        // initialize the queue
        EventPriorityQueue queue = new EventPriorityQueue();
        // add some numbers to the queue
        int NUM_EVENTS = 1;
        for (int i = NUM_EVENTS; i > 0; i--) {
            queue.insert(new Event(i), i);
            System.out.println("inserted " + i);
        }

        // poll everything
        for (int i = 1; i <= NUM_EVENTS + 1; i++) {
            int next = queue.poll().getTime();
            System.out.println("polled " + next);
        }

    }
}

我认为我的错误在这里:

public Event poll() {
    if (array[0] == null) {
        return null;
    }

任何提示/帮助将不胜感激!

【问题讨论】:

  • 那个程序逻辑很奇怪。当数组中的项目为空时,您想在poll() 中返回null,可以,但是调用poll() 的方法不会检查返回的值是否为null。当您的代码无法正确处理它时,使用 null 是没有意义的。
  • 您的poll() 不是这里的问题。您的代码中的其他内容无需检查返回值是否为null,这就是您得到 NullPointerException 的原因。
  • int next = queue.poll().getTime();。真的吗? queue.poll() 可以返回null。你不检查那个。所以它抛出一个 NullPointerException。正如预期的那样发生。如果您发布了实际的堆栈跟踪,您可以节省很多人的时间。

标签: java nullpointerexception priority-queue binary-heap


【解决方案1】:

我不太明白这个问题,但是我认为我看到了问题,试试这个 -

public Event poll() {
    if (array.length == 0) {
        return null;
    }

希望这会有所帮助!

【讨论】:

  • @Tom 哦,天哪,我没有正确阅读问题;(我现在将对其进行编辑,抱歉。
  • 好的,既然已经解决了,那就是来自 OP,NPE 的实际问题。你的代码是如何解决这个问题的?
【解决方案2】:
for (int i = 1; i <= NUM_EVENTS + 1; i++) {
            int next = queue.poll().getTime();
            System.out.println("polled " + next);
        }

这个循环运行了两次。请尝试删除 + 1 。那么就不会有 NullPointerException 了。

queue.poll() 在第二次迭代中为空。因此,当您在 null 上执行 getTime() 时。它抛出 NullPointerException。

【讨论】:

  • 我特意添加了+ 1,以检查在空数组上调用poll() 时代码是否会正确返回null。
  • 在这种情况下,您应该检查 if(queue.poll()!=null) 然后执行 queue.poll().getTime();
  • array[0] == null 给你真,因为数组持有一个空对象。
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 2011-11-04
  • 1970-01-01
  • 2022-01-25
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多