检查数组是不是为空而不获取 NullPointerException
Posted
技术标签:
【中文标题】检查数组是不是为空而不获取 NullPointerException【英文标题】: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 是没有意义的。
How can I check whether an array is null / empty?的可能重复
您的poll()
不是这里的问题。您的代码中的其他内容无需检查返回值是否为null
,这就是您得到 NullPointerException 的原因。
What is a NullPointerException, and how do I fix it?的可能重复
int next = queue.poll().getTime();
。真的吗? queue.poll()
可以返回null
。你不检查那个。所以它抛出一个 NullPointerException。正如预期的那样发生。如果您发布了实际的堆栈跟踪,您可以节省很多人的时间。
【参考方案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 给你真,因为数组持有一个空对象。以上是关于检查数组是不是为空而不获取 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
当其中一种数据类型可以为空而另一种不能为空时,是不是可以使用 linq 进行匿名连接? [复制]