尝试调用对象的函数时java中的NullPointerException

时间:2013-06-11 18:41:29

标签: java

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 个答案:

答案 0 :(得分: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);
}

<强> P.S。 :请关注Java的naming conventions

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是的,您必须初始化root,否则会将其设置为null,如您所见。您可以在构造函数中初始化它(即,)

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

或在声明时提供默认初始化。

protected tree root = new tree();

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

答案 3 :(得分:0)

您需要初始化tree root

tree root  =  new tree();