0
public abstract class destination{

    //Here are the data that are common in each of the 'File Types'
    protected tree root;
    //constructor that will call the correct constructor when a derived children is made.
    public destination()
    {
        super();        //Will call the other constructors
    }
    public void get_info()
    {
    }
    public void print()
    {

    }
    public void add_comment(String comment)
    {
           root.add_comments(root, comment); //null pointer exception
    }

}

我来自 C++,所以我以前从未遇到过这个问题。通常要访问一个函数,我可以像 root->add_comment(root, comment); 它会工作得很好,但是在java中它给了我一个空指针,我必须初始化root吗?因为在树类中我有一个 add_comment 函数,它递归地将一个节点添加到树中。

4

4 回答 4

5

您的实例变量root已声明但从未初始化。因此,您正试图root.add_comments(root, comment);null引用上调用方法。它是有效null.add_comments(root, comment);的,因此是 NullPointerException。

protected tree root; // is declared , never initialized.

您需要以某种方式对其进行初始化。

protected tree root = new tree(); 

tree或者在构造函数中传递一个新的实例destination并将其分配给实例变量。

public destination(tree root)
{
    super();        
    this.root = root;
}

这就是您在 Java 中进行空值检查的方式:

if(root!=null) { // lowercase "null"
     root.add_comments(root, comment);
}

PS:请遵循 Java 的命名约定

于 2013-06-11T18:43:18.053 回答
0

你永远不会初始化root. 与 C++ 不同,在 Java 中,所有变量都被视为引用/指针,因此在new处理指令之前不会创建实例。

于 2013-06-11T18:44:11.437 回答
0

是的,你必须初始化root,否则它被设置null为你所看到的。您可以在构造函数中初始化它(即)

public destination()
{
    super();
    root = new tree();
}

或在声明时给出默认初始化。

protected tree root = new tree();

将其视为对树的引用,而不是树本身。

于 2013-06-11T18:44:51.237 回答
0

你需要初始化tree root

tree root  =  new tree();
于 2013-06-11T18:44:59.113 回答