-1

这是我的模型类的片段:

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

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

有想法该怎么解决这个吗?

我在网上搜索了 NullPointerException 和各种回复/答案说必须初始化变量。我以为我已经在我的模型课上做到了。

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

4

2 回答 2

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()循环中调用了两次。

于 2013-08-15T01:54:56.120 回答
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);

现在,键将与值对齐,并且您将合法地获得OrganizationalStructure从 DAO 返回的每个参考。

鉴于此,您的错误在于认为NullPointerException这条线上的 the 来自getChildren()电话,而您的parent参考是真正的null.

parent.getChildren().add(organisationalStructure);
于 2013-08-15T01:47:29.837 回答