2017-05-09 1 views
0

Je récupère des données de mon db le place dans une classe personnalisée DataClass puis je formate mydata dans une ArrayList de nœuds et jusqu'à ce que tout se passe bien ici. Ensuite, je voudrais faire une boucle sur mes données et ajouter les enfants à chaque nœud. Mais je fais une erreur NullPointerException ...Impossible d'ajouter des enfants au nœud d'arbre

semble donc Ma classe comme:

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

J'ai une classe 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()); 
    } 
} 

J'ai donc une méthode qui forme un Liste des objets DataClass dans unArrayList de noeuds:

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

Et puis j'ai une méthode qui est suppo sed pour trouver tous les enfants pour chaque noeud:

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

Mais quand je l'appelle return mainService.addNodeChildren(mainService.formatData(dbData)); du contrôleur i ai cette erreur:

09-Mai-2017 11: 06: 18,498 GRAVES [ http-nio-8080-exec-211] null.null Une exception n'a pas été mappée en raison d'une défaillance du mappeur d'exceptions. La réponse HTTP 500 sera réactivée.
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

Avez-vous débogué votre code? Avec un IDE? – mtyurt

+0

Copie possible de [Qu'est-ce qu'une exception NullPointerException et comment la réparer?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it – f1sh

+0

@mtyurt Je travaille sur Intellij qui ne montre aucune erreur ... –

Répondre

1

vous ne avez effectué votre exemple pour les enfants,

Il y a de nombreuses corrections dont une est que vous pouvez changer votre méthode addChild à ceci:

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

     children.add(child); 
    } 
+0

Est-il préférable de changer la propriété children de la classe node de 'private List children = null;' à 'private Liste children = new ArrayList <>();'? –

+0

@GrechkaVassili mon opinion personnelle est de garder les enfants nuls si la classe n'a pas d'enfants. De cette façon, vous réduisez le nombre d'objets créés et stockés en mémoire. s'il vous plaît garder à l'esprit ses préférences personnelles, ne pas dire que votre solution est fausse – nafas