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;
  }
}