Java 从动态对象数组调用方法时出现NullPointerException
你好 这是我的密码:Java 从动态对象数组调用方法时出现NullPointerException,java,exception,object,Java,Exception,Object,你好 这是我的密码: public class ArrayDirectory implements Directory { private int allocatedSize = 0; public Entry[] entryDirectory = new Entry[allocatedSize]; @Override public void addEntry(Entry newEntry) { newEntry = findFreeLocation(); entryDir
public class ArrayDirectory implements Directory {
private int allocatedSize = 0;
public Entry[] entryDirectory = new Entry[allocatedSize];
@Override
public void addEntry(Entry newEntry) {
newEntry = findFreeLocation();
entryDirectory = Arrays.copyOf(entryDirectory,
entryDirectory.length + 1);
}
private Entry findFreeLocation() {
Entry returnedEntry = new Entry();
for (int i = 0; i < entryDirectory.length; i++) {
if (entryDirectory[i] == null) {
break;
}
returnedEntry = entryDirectory[i];
}
return returnedEntry;
}
下面是Entry对象的getInitials()方法
public Entry(String surname, String initials, int extension){
this.surname = surname;
this.initials = initials;
this.extension = extension;
}
public String getInitials() {
return initials;
}
您从不将任何内容分配为数组的元素
entryDirectory
,因此当您尝试调用空值对象entryDirectory[0]
上的getInitials()
时,会出现NullPointerException
请记住,如果使用
Arrays.copyOf()
对于在副本中有效但在原件中无效的任何索引
副本将包含空值
请参见除了Philip Voronov的答案之外,您的
FindFileLocation
方法的实现也不正确。假设null表示没有值,则正确的实现应如下所示:
private int findFreeLocation() {
for (int i = 0; i < entryDirectory.length; i++) {
if (entryDirectory[i] == null) {
return i
}
}
return -1;
}
public void addEntry(Entry newEntry) {
int loc = findFreeLocation();
if (loc >= 0) {
entryDirectory[loc] = newEntry;
} else {
entryDirectory = Arrays.copyOf(entryDirectory, entryDirectory.length + 1);
entryDirectory[entryDirectory.length - 1] = newEntry;
}
}
也就是说,我强烈建议您使用一个内置的集合来处理自动调整大小的数组。它们更易于使用,性能也更好(与ArrayList的实现相比,增加数组大小意味着每次添加项时都必须调整大小,而ArrayList的实现每次填充时都要将大小加倍)。您在哪一行面临此问题????或stacktrace?System.out.println(d.entryDirectory[0].getInitials());通常的假设是,您试图为调用使用空引用。识别该行,找出使用了什么引用,并找出它为空的原因。这是非常基本的东西。非常感谢!我对这一切感到很困惑。再次感谢大家!!!我知道最好使用ArrayList,但这是一个uni作业,老师告诉我们不要使用ArrayList。这就是我在这里使用数组的原因。
public void addEntry(Entry newEntry) {
int loc = findFreeLocation();
if (loc >= 0) {
entryDirectory[loc] = newEntry;
} else {
entryDirectory = Arrays.copyOf(entryDirectory, entryDirectory.length + 1);
entryDirectory[entryDirectory.length - 1] = newEntry;
}
}