2017-05-09 220 views
0

我检索我的数据库的数据放在一个自定义类DataClass内,然后我格式化MYDATA到节点的一个ArrayList,直到这里每一件事情是好的。然后,我想对我的数据进行循环,并将子项添加到每个节点。但我有一个NullPointerException错误...无法孩子添加到树节点

所以我班的样子:

@Entity 
public class DataClass { 
    @Id 
    private Integer id; 
    private String structureDescription; 
    private String structId; 
    private String structureTag; 
    private Integer elementId; 
    private String elementDescription; 
    private Integer elementsSuite; 
    private String elementTag; 
    private Integer parent; 
    private Integer elementTypeId; 

然后,我有一个Node类:

public class Node { 
    private String id = "-1"; 
    private List<Node> children = null; 
    private String parent = "#"; 
    private String text = ""; 

    public Node(){} 

    public Node(String id, String parent, String text) { 
     this.id = id; 
     this.parent = parent; 
     this.text = text; 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public List<Node> getChildren() { 
     return children; 
    } 

    public void setChildren(List<Node> children) { 
     this.children = children; 
    } 

    public void addChild(Node child) 
    { 
     children.add(child); 
    } 

    public String getParent() { 
     return parent; 
    } 

    public void setParent(String parent) { 
     this.parent = parent; 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public boolean equals(Node node) 
    { 
     return node.getText().equals(getText()); 
    } 
} 

所以我有一个方法,它的格式DataClass对象列表成为ArrayList节点:

public ArrayList<Node> formatData(List<DataClass> dbData) 
{ 
    ArrayList<Node> result = new ArrayList<>(); 

    for(DataClass dbDataElement : dbData) 
    { 
     Node node = new Node(); 
     node.setId(String.valueOf(dbDataElement.getId()) == null ? "" : String.valueOf(dbDataElement.getId())); 
     node.setParent(String.valueOf(dbDataElement.getParent())); 
     node.setText((dbDataElement.getElementTag() == null) ? dbDataElement.getStructId() : dbDataElement.getElementTag()); 
     result.add(node); 
    } 
    return result; 
} 

然后我有一个方法是suppo SED找到所有的每个节点的孩子:

public ArrayList<Node> addNodeChildren(ArrayList<Node> formattedNodes) 
{ 
    ArrayList<Node> result = new ArrayList<>(); 

    for(Node parent: formattedNodes) 
    { 
     for(Node possibleChild: formattedNodes) 
     { 
      if(String.valueOf(parent.getId()).equals(possibleChild.getParent())) 
      { 
       parent.addChild(possibleChild); 
      } 
     } 
    } 

    return result; 
} 

但是,当我打电话return mainService.addNodeChildren(mainService.formatData(dbData));从我遇到这个错误控制器:

09月 - 2017年11:06:18.498严重[ HTTP-NIO-8080-EXEC-211] null.null一种 异常没有被映射由于异常映射器故障。 HTTP 500 响应将被重新开启。
显示java.lang.NullPointerException

at be.groups.observatory.domainmodel.Node.addChild(Node.java:38)   

    at be.groups.observatory.be.groups.observatory.services.MainService.addNodeChildren(MainService.java:37) 

    at be.groups.ui.resource.StructureResource.getAllChildren(StructureResource.java:130) 
+1

你调试了你的代码吗?使用IDE? – mtyurt

+0

的可能的复制[什么是空指针异常,怎么解决呢?(http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) – f1sh

+0

@mtyurt我工作的IntelliJ未显示任何错误... –

回答

1

你从未启动你的孩子例如,

有许多修正,其中之一是,你可以改变你的方法addChild这样:

public void addChild(Node child) 
    { 
     if(children==null){ 
      children=new ArrayList<Node>(); 
     } 

     children.add(child); 
    } 
+0

是更好地改变从'私人列表孩子= NULL节点类的子女的财产;''到私人列表孩子=新的ArrayList <>();'? –

+0

@GrechkaVassili我个人的意见是让孩子空,如果类没有孩子。这种方式可以减少创建并存储在内存中的对象的数量。请记住它的个人偏好,而不是说你的解决方案是错误的 – nafas