我有一个名为AgendaFunctions的类,一个名为Main的类和一个名为ReadFiles的类。 Main有一个Agenda Functions和ReadFiles的引用变量。 AgendaFunctions有一组引用变量。我有代码来实例化数组,但我需要从ReadFiles实例化它。如果我从main实例化它,它工作正常。但是,如果我从ReadFiles调用该方法,它不起作用。我收到java.lang.NullPointerException错误。 以下是Main的代码:
public class Main {
public static void main(String[] args) throws Exception {
ReadFiles fw = new ReadFiles(); fw.read();
agendafunctions link = new agendafunctions();
AgendaFunctions:
public class agendafunctions {
int amount = 20;
public void setamount(int data) {
}
static String input = "true";
agendaitem item[] = new agendaitem[amount];
int counter = 0;
public void instantiate() {
item[1] = new agendaitem();
item[2] = new agendaitem();
item[3] = new agendaitem();
}
public void createobject(String name, Boolean complete, String Comments) {
item[counter].name = name;
item[counter].complete = complete;
item[counter].comments = Comments;
counter++;
}
ReadFiles:
public class ReadFiles {
public void read() throws IOException {
agendafunctions af = new agendafunctions(); af.instantiate();
int readitem = 1;
BufferedReader data = new BufferedReader(new FileReader("C:/Agenda Dev Docs/data.txt"));
int filestoread = Integer.parseInt(data.readLine());
while (readitem <= filestoread) {
String name;
String complete;
String comments = null;
String line;
Boolean bc = null;
BufferedReader read = new BufferedReader(new FileReader("C:/Agenda Dev Docs/"+readitem+".txt"));
readitem++;
name = read.readLine();
complete = read.readLine();
comments = "";
while((line = read.readLine()) != null) {
comments = comments + line;
}
if(complete.equals("Complete")) {
bc = true;
} else if(complete.equals("Incomplete")) {
bc = false;
}
af.createobject(name, bc, comments);
}
}
如果我从ReadFiles调用该方法实例化,我会得到一个NullPointerException。如果我从Main调用它,一切正常。但是进一步的开发需要我从ReadFiles中调用该方法。我该如何解决这个问题?感谢。
答案 0 :(得分:2)
你有这个
int counter = 0;
public void instantiate() {
item[1] = new agendaitem();
item[2] = new agendaitem();
item[3] = new agendaitem();
}
public void createobject(String name, Boolean complete, String Comments) {
item[counter].name = name;
item[counter].complete = complete;
item[counter].comments = Comments;
counter++;
}
其中item
是一个包含20个索引的数组,即20个元素,但是instantiate
方法只初始化索引1到3的元素,缺少0和4到19。
在ReadFiles#read()
方法中,您可以
agendafunctions af = new agendafunctions(); af.instantiate();
实例化一个 agendafunctions
对象并调用instantiate()
来初始化索引1
,2
和3
中的元素你的item
数组。
然后循环while
并致电
af.createobject(name, bc, comments);
在相同对象上多次。
第一次失败的原因是因为你没有在item
处初始化索引为0的元素。数组总是从0
开始,而不是1。
错误的另一个原因(如果你解决了上述问题,你会看到),如果你的while
循环循环超过3次,你将再次得到一堆NullPointerException
因为counter
不断增长,但您没有初始化您将尝试在counter
索引处访问的元素。
item[counter].name = name; // if counter is 4, you'll get NullPointerException because
// the element there hasn't been initialized as 'new agendaitem();'
答案 1 :(得分:0)
@SotiriosDelimanolis解释了为什么要获得NPE
,以解决您可以摆脱instantiate()
方法并在item[counter] = new agendaitem();
方法中添加createobject
作为第一行。此外,您必须确保您的while循环不超过amount
。为避免这些担忧,请更好地使用ArrayList agendaitem