今天在用Java实现链表时,用到了对象数组,在运行程序时,程序抛出异常:java.lang.NullPointerException。如下的代码:
public class StaticLinkList {
public static class LNode {
public Object data;
public int cursor;
public LNode(){
}
}//静态内部类, 不产生外部类对象的引用
private LNode[] LinkList = null;
private int head;//头结点索引
//创建备用链表(数组), 结点数为size, linklist[0].cursor为头指针
//同时创建链表, 分配头结点, 初始化头结点指针
public StaticLinkList(int size){
LinkList = new LNode[size];
for(int i = 0; i < size; i++)
LinkList[i].cursor = i + 1; //这一行的代码导致异常抛出
LinkList[size - 1].cursor = 0;
head = Malloc();
LinkList[head].cursor = 0;
}
开始以为是内部类的问题,经查阅资料,发现原来是对象数组的问题。代码LinkList = new LNode[size];仅仅是分配了保存对象引用的数组空间,但是并没有为要引用的对象分配空间;而代码LinkList[i].cursor = i + 1; 却引用了对象数组元素引用的对象,由于没有创建数组元素引用的对象,因此数组元素都为null,从而导致抛出异常:java.lang.NullPointerException。
将代码修改为如下,问题得以解决:
public StaticLinkList(int size){
LinkList = new LNode[size];
for(int i = 0; i < size; i++){
LinkList[i] = new LNode();
LinkList[i].cursor = i + 1;
}
LinkList[size - 1].cursor = 0;
head = Malloc();
LinkList[head].cursor = 0;
}
Java的对象数组和C的指针数组有类似的特性。