带ArrayList的java.lang.NullPointerException

时间:2013-08-15 01:46:27

标签: java

这是我的模型类的片段:

public class OrganisationalStructure {
    Integer pk;
    String parentId;
    String childId;
    String description;
    ArrayList<OrganisationalStructure> children = new ArrayList<OrganisationalStructure>();

这是我的服务类的片段:

HashMap<String, OrganisationalStructure> hashMap = new HashMap<String, OrganisationalStructure>();
Iterator<OrganisationalStructure> iterator = staffDao.getOrganisationalStructure().iterator();

while (iterator.hasNext()) {
    hashMap.put(iterator.next().getChildId(), iterator.next());
}

for (OrganisationalStructure organisationalStructure: hashMap.values()) {
    OrganisationalStructure parent = hashMap.get(organisationalStructure.getParentId());
    parent.getChildren().add(organisationalStructure);
}

根据我的理解,我的模型类中的children变量已正确初始化,但遇到服务类的“parent.getChildren”行时,Tomcat会抛出NullPointerException。

有关如何解决此问题的任何想法?

我在网上搜索了NullPointerException,各种回复/回答说这个变量必须初始化。我以为我已经在我的模特课中做过了。

staffDao.getOrganisationStructure是一个返回DB记录的类。我正在使用hibernate来检索数据。

2 个答案:

答案 0 :(得分:2)

更改此

while (iterator.hasNext()) {
    hashMap.put(iterator.next().getChildId(), iterator.next());
}

while (iterator.hasNext()) {
    OrganisationalStructure oStruct = iterator.next();
    hashMap.put(oStruct.getChildId(), oStruct);
}

应使用Iterator#next()检查每个hasNext()。你在循环中调用next()两次。

答案 1 :(得分:0)

也许您的parent未初始化。根据您展示的内容,我可能认为organisationalStructure.getParentId()不是HashMap中的关键。但是我们必须看到填充它的代码。

回答您的问题:是的,您已正确初始化ArrayList。因此,假设getChildren()返回ArrayList,它不应返回null(除非您的代码中的其他位置修改了引用)。

回复您编辑的帖子:

您的代码结构毫无意义。下面的行将获取两个新记录,这肯定不是您想要的。基本上,您的所有密钥都将与不正确的OrganizationalStructure匹配,并且每个其他条目只会有密钥。

hashMap.put(iterator.next().getChildId(), iterator.next());

相反,您需要存储对iterator.next()返回的引用,例如:

OrganizationalStructure next = iterator.next();
hashMap.put(next.getChildId(), next);

现在键将与值对齐,您将合法地为DAO返回的每个OrganizationalStructure提供一个引用。

鉴于此,您的错误在于认为此行上的NullPointerException来自getChildren()来电,当您的parent引用真的是null时。

parent.getChildren().add(organisationalStructure);