2013-06-11 22 views
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中它给了我一个空指针,我必须初始化根?因为在树类中我有一个add_comment函数,递归地将一个节点添加到树中。尝试调用对象的函数时,Java中的NullPointerException

+2

是的,你必须初始化'root'。即使在C++中,您也无法在空引用上调用函数。另外,你似乎误解了继承 - 'super()'将调用Object的构造函数,而不是你的子类。你的子类是否在自己的构造函数中初始化root? –

+0

不,他们不!我刚开始哈哈,谢谢我已经把所有派生超级,并由于某种原因把它放在基类-_- – ZZPLKF

+0

如果你尝试在C++的'NULL'指针'root-> add_comment'你会得到一个段错误。这是类似的情况。 – trutheality

回答

5

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

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

您需要以某种方式初始化它。

protected tree root = new tree(); 

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

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

这是你如何在Java中做一个空检查:

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

附: :请按照Java的naming conventions

+0

我不想初始化它,我希望它是一个空指针,因为然后我检查是否(root == NULL)然后我会创建树节点。 – ZZPLKF

+1

然后,您需要在每次尝试使用它(并创建实例)之前检查'if(root == null)'(小写) – SJuan76

+0

嗯,好的,但是我试图让它如此树类处理树节点的创建。有没有办法让root保持null并且能够从树节点调用该函数? – ZZPLKF

0

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

0

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

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

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

protected tree root = new tree(); 

把它看作是对树而不是树本身的引用。

0

需要初始化tree root

tree root = new tree(); 
相关问题