所以我一直在为为什么现在不工作一个小时而绞尽脑汁。我有两个类,一个类包含一个ArrayLists的ArrayList和一个向该列表添加另一个元素的方法,另外两个类,我正试图从中访问该方法。
public class One
{
private ArrayList<Element> myarraylist;
public One()
{
myarraylist = new ArrayList<Element>();
}
public void addElement(String name)
{
myarraylist.add(new Element(name));
}
}
//Element being another class
public class Two
{
One database;
public static void main(String[] args)
{
Two two = new Two();
two.startMenu();
}
public Two()
{
One database = new One();
}
public void addElem()
{
Scanner keyboard = new Scanner(System.in);
String name = keyboard.next();
database.addElement(name);
}
}
//where startMenu is just a small multiple choice menu thingy
问题是,当我尝试运行它并到达最后一行时,收到消息:java.lang.NullPointerException
我尝试检查对象(我使用BlueJ),当我仅创建类One的实例时初始化ArrayList,但是当我创建类Two的实例时,数据库实例为空。
提前感谢您的回答:D
答案 0 :(得分:0)
问题出在以下几行
public class Two
{
One database;
public Two()
{
One database = new One();
//this variable is not the same as the one declared outside the constructor
}
在与类中声明的变量同名的方法中声明变量时,在方法内部声明的变量上发生的修改将不会在方法外部的变量中看到(因为2个变量是不同)。该方法中的变量使该类中的变量不可见。 要区分这两个变量,您必须使用 this 关键字
this.database = new One();
最终解决方案应该是
public class Two
{
One database;
public Two()
{
this.database = new One();
}
执行 database.addElement(name); 时得到 NullPointerException 的原因是,在您的示例中,数据库并未被实例化创建的对象存储在另一个名为 database 的变量中,而不是声明为class属性的那个变量。