Java 空指针运行时异常

Java 空指针运行时异常,java,nullpointerexception,heap,Java,Nullpointerexception,Heap,似乎找不到问题,我的代码现在有点迷失了。。。真的需要一双更好的眼睛。非常感谢 以下是错误: Exception in thread "main" java.lang.NullPointerException at Heap.<init>(Heap.java:16) at Heap$1.<init>(Heap.java:131) at Heap.main(Heap.java:131) 线程“main”java.lang.NullPointerExc

似乎找不到问题,我的代码现在有点迷失了。。。真的需要一双更好的眼睛。非常感谢

以下是错误:

Exception in thread "main" java.lang.NullPointerException
    at Heap.<init>(Heap.java:16)
    at Heap$1.<init>(Heap.java:131)
    at Heap.main(Heap.java:131)
线程“main”java.lang.NullPointerException中的异常 在堆上。(Heap.java:16) 堆$1。(Heap.java:131) 位于Heap.main(Heap.java:131)

公共抽象类堆{
私有列表heap_array;//包含heap的Arraylist。
private List priority_queue;//包含元素的ArrayList。
private int heapsize;//堆的最大heapsize。
private int n;//堆中当前的元素数。
private int last\u elem=heap\u array.size()-1;//堆中的最后一个元素
公共堆(整数s,整数n){
heap_array=new ArrayList();
priority_queue=new ArrayList();
s=治愈;
n=这个。n;
}
受保护的int returnMaxPriority(){
int max=priority_queue.get(priority_queue.size()-1).getLocation();
返回最大值;
}
公共空移时差(int i){
int leftChild=leftChild(i);
int rightChild=rightChild(i);
int=i;
//马克斯·希皮菲
if(leftChild0&&!高于相等(父对象(object_i),object_i)){
开关元件(父(对象i)、对象i);
object_i=父对象(object_i);
}
//排队(对象_i,优先级);
}
公共对象removeLast(){
if(heap_array.size()>0){
开关元件(0,最后一个元件);
对象结果=堆数组.remove(最后一个元素);
移位下降(0);
返回结果;
}否则{
返回null;
}
}
公共对象get(int索引){
return heap_array.get(index);//返回对象
}
公共int-heapsize(){
返回heap_array.size();
}
受保护的整数父级(整数i){
返回(i-1)/2;
}
受保护的无效更新\u N(int N){
n=这个。n;
}
受保护的无效更新大小(整数大小){
heapsize=大小;
}
受保护的整数leftChild(整数i){
返回2*i+1;
}
受保护的int rightChild(int i){
返回2*i+2;
}
受保护的无效开关元件(int i,int j){
对象tmp=heap\u array.get(i);
heap_array.set(i,heap_array.get(j));
heap_array.set(j,tmp);
}
公共无效排队(int对象_i,int优先级){
ELEM tmp=新的ELEM(优先级,对象_i);
优先级队列添加(对象i,tmp);
}
公共整数出列(){
if(heap_array.size()>0){
int max_location=returnMaxPriority();
堆数组。删除(最大位置);
返回最大位置;
}
else{return-1;}
}
公共void可变权重(int对象_i,int优先级){
ELEM tmp=新的ELEM(优先级,对象_i);
优先级队列集合(对象队列,tmp);
}
受保护的抽象布尔值高于相等值(int-value1,int-value2);
公共静态void main(字符串[]args){
堆h=新堆(100,20){
受保护的布尔值高于相等值(int-value1,int-value2){
return((整数)get(value1)).intValue()
>=((整数)get(value2)).intValue();//比较对象的int值。
}
};
System.out.println(“输入数字列表,然后键入quit:”);
对于(int i=0;i<100;i++){
h、 插入(新整数((int)(100*Math.random()),i);
}
}
}

类sortPriorityArray实现了Comparator{
@凌驾
公共整数比较(元素s1、元素s2){
int value1=s1.getPriority();
int value2=s2.getPriority();
如果(值1<值2){
返回1;
}
否则如果(值2>值1){
返回-1;
}
返回0;
}

如果您还可以看看我的insert函数和returnmax。类ELEM包含优先级和位置,因此我可以通过按优先级排序队列,然后首先将最高优先级的队列排出来,从而以正确的顺序排出来。

n=this.n;
可能是罪魁祸首。您正在尝试在我之前参考
this.n
初始化它。除非您正在初始化(而不是引用)
this
的成员,否则要避免在构造函数中使用
this


编辑:我猜你的意思是
this.n=n;
?刚刚看到你的评论,我想这就解释了。

n=this.n;
可能是罪魁祸首。你试图在初始化它之前引用
this.n
。除非你正在初始化(不引用),否则你要避免在构造函数中使用
this
的成员

编辑:我猜你的意思是这个。n=n;?刚刚看到你的评论,我想这就是原因。:)

此行对尚未初始化的列表调用
size()


此行对尚未初始化的列表调用
size()

private int last_elem = heap_array.size()-1; // last elem in the heap
此时,heap_数组尚未初始化,因此它是
null
。最简单的解决方案是将其移动到构造函数或将其设置为

private int last_elem = -1; // last elem in the heap
因为这会做同样的事情

顺便说一句,如果您想知道如何自己解决这个问题,您可以在调试器中逐步完成代码,它是IDE中运行的旁边的按钮。

private int last_elem = heap_array.size()-1; // last elem in the heap
private int last_elem = heap_array.size()-1; // last elem in the heap
private int last_elem = -1; // last elem in the heap