关于创建元素包装器的空指针

时间:2016-11-23 14:41:09

标签: java xml javafx wrapper treetableview

我正在尝试从XML文档创建可编辑的TreeTableView。 为此,我将文档中的元素包装在一个类中。 元素的数据存储在属性key和val中。 我的包装由

组成
private Element node;

private final StringProperty key = new SimpleStringProperty(this,  node.getAttribute("key"), "temp");
private final StringProperty val = new SimpleStringProperty(this, node.getAttribute("val"), "temp");

public ElementWrapper(Element n){
    System.out.println("creating element "+n.getNodeName());
    node = n;
}
public String getKey(){
    return key.get();
}
@Override
public String getVal(){
    return key.get();
}
public void setKey(String key){
    ((Element)node).setAttribute("key", key);
}
@Override
public void setVal(String value){
    ((Element)node).setAttribute("val", value);
}
@Override
public Element getElement(){
    return node;
}
@Override
public StringProperty keyProperty(){
    return key;
}
@Override
public StringProperty valProperty(){
    return val;
}

我编写了一个递归算法,用于创建树项并使用

设置它们
TreeItem<NodeWrapper> newsub = new TreeItem<>(new ElementWrapper(current));

其中current是XML元素。在这一点,我得到一个NullPointerException  lib.ElementWrapper.<init>(ElementWrapper.java:21) 这是上面发布的Wrapper类的第二行。 我该如何正确设置?

1 个答案:

答案 0 :(得分:3)

将其更改为:

private Element node;

private final StringProperty key;
private final StringProperty val;

public ElementWrapper(Element n){
    System.out.println("creating element " + n.getNodeName());
    node = n;
    key = new SimpleStringProperty(this, node.getAttribute("key"));
    val = new SimpleStringProperty(this, node.getAttribute("val"));
}

因为这些初始化是在执行costructor之前完成的:

private final StringProperty key = new SimpleStringProperty(this,  node.getAttribute("key"), "temp");
private final StringProperty val = new SimpleStringProperty(this, node.getAttribute("val"), "temp");

以下是关于初始化的好问题:Java order of Initialization and Instantiation 官方文件:Initializing Fields