我真的很困惑:我只是想将ArrayList
中每个对象的名称添加到另一个ArrayList
。
for (int i = 0; i < availableParts.size(); i++) {
for (int j = 0; j < namesOfIngredients.size(); j++){
if (availableParts.get(i).getName() != namesOfParts.get(j)){
namesOfParts.add(availableParts.get(i).getName());
}
}//middle if statement makes sure there are no repeats
}
编辑:我意识到namesOfIngredients为null。但是,我需要它来启动null - 这就是我复制名称的方式。这可不是这样做的吗?
答案 0 :(得分:8)
确保
availableParts
和namesOfIngredients
都不是null
namesOfParts
)添加元素的列表已使用构造函数(不是null
)正确初始化。null
请记住,字符串比较是使用String.equals()
完成的。检查两个String对象上的相等性(==
)只有在它们是同一个实例时才返回true。
作为旁注,您可以考虑使用List.contains()
来查明某个部分的名称是否在namesOfIngredients
列表中。此外,也许这是一个拼写错误,但你应该检查namesOfParts.get(j)
{{1}}在同等检查中。
答案 1 :(得分:3)
你试图在循环本身中查看namesOfParts,但是在循环的定义中,你将使用namesOfIngredients的长度。其中一个是空的吗?我打赌一个是。
答案 2 :(得分:0)
availableParts.get(i)可能为null,因此getName()调用会产生NPE。
答案 3 :(得分:0)
我们不知道:我们无法看到availableParts
和namesOfParts
的初始化方式。
但我们可以告诉你如何找出答案。像这样添加打印语句:
print "Before I try it"
print availableParts.get(i)
print namesOfParts(availableParts.get(i))
print "done"
当它是NPE的时候,你会看到究竟是哪一个做了这件事。
答案 4 :(得分:0)
您似乎在循环中调用了许多方法,而没有检查您调用它的对象是否为NULL。总是建议这样做(特别是,如果你不确定给定方法返回的对象的合同)
因此,基本上,每当您执行object.method()
和/或object.method1().method2()
之类的操作时,请确保在调用后续方法之前object
和/或object.method1()
为非NULL他们的回报值。
此外,您可以通过以下方式中断呼叫,以便在确切位置更好地调试和捕获NPE:
Object returnObj = object.method1();
Object anotherReturn = returnObj.method2();
答案 5 :(得分:0)
鉴于您的编辑 - 您如何声明namesOfIngredients?
应该是
Object namesOfIngredients = new Object();
不是
Object namesOfIngredients;