这是我的模型类的片段:
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来检索数据。
答案 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);