我在SO上多次看过这个2d Arraylist Question,但不明白为什么这对我的语言应用程序不起作用。
我有一个包含多个arraylists的arraylist(名为NULL
)(每个都称为stage1
)entry
正确显示数据库值,所以我确信其他地方的查询字符串是正确的(例如System.out.println("In switch: this is entry" + entry);
但是当我向第1阶段添加条目并尝试通过[In switch: this is entry[water, aqua, C:\Users\Username\Documents\NetBeansProjects\LanguageApp\src\Images\Categories\Food images\water.png])
访问它时,我收到错误"引起:java.lang.IndexOutOfBoundsException:Index:0,Size:0"这就是我测试stage1是否为空的原因。另一个跟踪语句确认即使添加了条目,stage1也为null。
stage1.get(0).get(0)
答案 0 :(得分:3)
您每次都使用单个对象,这就是为什么它会使索引超出范围异常
只需将你的arraylist放入for循环
ArrayList<String> entry = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
//put you code here
ArrayList<String> entry = new ArrayList<String>();
entry.add("sd");
entry.add("sd");
entry.add("sd");
System.out.println("This is entry" + entry);
stage1.add(entry);
//entry.clear();
if(stage1.size()==0){ System.out.println("Stage1 " + stage1.get(0).get(0));
}
else {System.out.println("IT IS NULL");}
}
这将为您提供所需的输出。
答案 1 :(得分:2)
Java中的每个对象都是引用对象。传递函数的对象trought参数时,传递引用。如果修改方法内部或外部的对象,则将修改对象的内部和外部功能。
我建议你仔细看看这一切。
Is Java "pass-by-reference" or "pass-by-value"?
现在,为了解决您的问题,您可以重新注册entry = new ArrayList();
并开始每个循环,并删除entry.clear();
。
ArrayList<List<String>> stage1 = new ArrayList<>();
ArrayList<String> entry = null;
int count = 0;
//words is an Observable List of all words relating to a specific category and langage
for (Words k : words) {
entry = new ArrayList<>();
String eng = k.getEnglishWord();
String trans = "";
switch (lang) {
case "spanish":
trans = k.getSpanishWord();
break;
case "french":
trans = k.getFrenchWord();
break;
case "german":
trans = k.getGermanWord();
break;
}
String pic = k.getPicture();
entry.add(eng);
entry.add(trans);
entry.add(pic);
System.out.println("This is entry" + entry);
stage1.add(entry);
//entry.clear();
if(stage1.size()!=0){ System.out.println("Stage1 " + stage1.get(0).get(0));
}
else {System.out.println("IT IS NULL");}
}