我无法从列表中检索数据。这些值似乎永远不会被存储,或者对象被初始化了? 我创建了一个存储一些变量的类:
public class storage{
public int a = 0;
public int b = 0;
}
然后我创建了另一个填充a的类,并且b创建了一些值并将该对象存储在列表中
public class anotherclass{
public List<storage> alldata = new ArrayList<storage>();
public void filldata(){
storage tmp = new storage();
for (int i = 1; i <= 10; i++){
tmp.a = i;
tmp.b = i;
alldata.add(tmp);
}
}
}
但是当我在我的主类中运行filldata()时,尝试从列表a中获取对象,而b仍然设置为0。
public static void main(String[] args){
anotherclass obj = new anotherclass();
obj.filldata()
for (int i = 0; i <= obj.alldata.size() - 1; i++){
System.out.println(obj.alldata.get(i).a)
System.out.println(obj.alldata.get(i).b)
//Outputs as all zeroes
}
}
怎么会这样?
答案 0 :(得分:7)
每次尝试创建对象。否则它使用相同的对象。所以只有它不会添加到你的列表中。
storage tmp = null;
for (int i = 1; i <= 10; i++)
{
tmp = new storage();
tmp.a = i;
tmp.b = i;
alldata.add(tmp);
}
而不是
storage tmp = new storage();
for (int i = 1; i <= 10; i++)
{
tmp.a = i;
tmp.b = i;
alldata.add(tmp);
}
答案 1 :(得分:2)
以下行应位于for
方法的filldata()
循环中。
storage tmp = new storage();
因为每次你需要创建一个新对象来添加到列表中。在您的情况下,相同的对象将被新值覆盖。
此外,main
方法的语法错误。它应该是
public static void main(String[] args)
旁注:复制粘贴IDE中的错误代码。请不要在这里输入。你的代码有很多编译问题(语法错误,缺少分号等)。我说这个的原因是因为我提到的解决方案是你得到所有* 10 * s作为输出而不是* 0 * s的情况。如果你得到* 0 * s,那么你发布的代码就不是那个问题。
答案 2 :(得分:1)
filldata()方法中存在指针缺陷。您只创建了一个对象tmp,并将相同的对象添加到整个列表中。列表中的所有条目都指向同一个对象。要解决您的问题,您应该首先为每个条目创建一个新对象。
将filldata()替换为:
public void filldata(){
storage tmp;
for (int i = 1; i <= 10; i++){
tmp = new storage();
tmp.a = i;
tmp.b = i;
alldata.add(tmp);
}
}
答案 3 :(得分:0)
这是你的程序打印所有10个(而不是你说的0),这是错误的。根据@newuser
的答案进行修改import java.util.*;
class storage{
public int a = 0;
public int b = 0;
}
public class anotherclass{
public List<storage> alldata = new ArrayList<storage>();
public void filldata(){
storage tmp = new storage();
for (int i = 1; i <= 10; i++){
tmp.a = i;
tmp.b = i;
alldata.add(tmp);
}
}
public static void main(String[] args){
anotherclass obj = new anotherclass();
obj.filldata();
for (int i = 0; i <= obj.alldata.size() - 1; i++){
System.out.println(obj.alldata.get(i).a);
System.out.println(obj.alldata.get(i).b);
}
}
}
答案 4 :(得分:0)
希望这可以帮到你,即使上面的代码也有内部类静态引用错误。
下面的示例包含new storage();
for
循环,它会创建一个新对象,并在每次迭代时获取新的 a和b 值。
import java.util.ArrayList;
import java.util.List;
public class StackClass {
class Storage {
public int a = 0;
public int b = 0;
}
public class AnotherClass {
public List<Storage> allData = new ArrayList<Storage>();
public void fillData() {
for (int i = 1; i <= 10; i++) {
Storage tmp = new Storage();
tmp.a = i;
tmp.b = i;
allData.add(tmp);
}
}
}
public static void main(String[] args) {
StackClass stack = new StackClass();
AnotherClass obj = stack.new AnotherClass();
obj.fillData();
for (int i = 0; i <= obj.allData.size() - 1; i++) {
System.out.println("Objec[" + i + "].a-" + obj.allData.get(i).a);
System.out.println("Objec[" + i + "].b-" + obj.allData.get(i).b);
}
}
}