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函数,它递归地将一个节点添加到树中。
答案 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();