我有一个数据对象列表,其中包含结果列表。我想在另一个列表中以相同的顺序保存所有结果列表。但是,某些结果元素列表为空。
在获取所有字符串值之前,我正在清理列表:
for (int i = 0; i < dataList.size(); i++) {
if (dataList.get(i).getResultList() == null) {
dataList.remove(i);
}
}
然后我想写入另一个列表:
//double List to String
List<List<String>> ar_List = new ArrayList<List<String>>();
for (int i = 0; i < dataList.size(); i++) {
for (int j = 0; j < dataList.get(i).getResultList().size(); j++) {
if(dataList.get(i).getResultList().get(j) != null) {
ar_List.get(i).add(dataList.get(i).getResultList().get(j).toString());
} else {
ar_List.get(i).add("null");
}
}
}
但是我在NullPointerException
获得了if(dataList.get(i).getResultList().get(j) != null) {
。那是因为一些dataList对象是null。然而,这是不可能的,因为我之前清理了清单。有什么建议吗?
感谢您的回答!
更新
使用:
for (int i = dataList.size()-1; i >=0 ; i--) {
if (dataList.get(i).getResultList() == null) {
dataList.remove(i);
}
}
List<List<String>> ar_List = new ArrayList<List<String>>();
for (int i = 0; i < dataList.size(); i++) {
for (int j = 0; j < dataList.get(i).getResultList().size(); j++) {
if(dataList.get(i).getResultList().get(j) != null) {
ar_List.get(i).add(dataList.get(i).getResultList().get(j).toString());
} else {
ar_List.get(i).add("null");
}
}
}
结果是:
在java.lang.IndexOutOfBoundsException:
ar_List.get(i).add(dataList.get(i).getResultList().get(j).toString());
答案 0 :(得分:2)
问题在于删除部分。您正在删除列表项,以便您的列表将被更改,它将跳过一些清除的项目。您可以使用迭代器或向下移除项目,如下所示:
您可以替换:
for (int i = 0; i < dataList.size(); i++) {
if (dataList.get(i).getResultList() == null) {
dataList.remove(i);
}
}
与
for (int i = dataList.size()-1; i >=0 ; i--) {
if (dataList.get(i).getResultList() == null) {
dataList.remove(i);
}
}
答案 1 :(得分:1)
您正在使用导致问题的forLoop。而是使用迭代器删除列表中不需要的元素
for (E element : list) {
// 1 - can call methods of element
// ...
}
假设您有一个列表[0:item, 1:null, 2: null, 3: item]
循环1:不删除[0:item, 1:null, 2: null, 3: item]
循环2:删除项目@ index 1'[0:item, 1:null, 2: item]
循环3:没有删除项目@索引2有效[0:item, 1:null, 2: item]
所以当你在一个新的for循环中再次循环时,索引1处的null会导致NPE。
答案 2 :(得分:1)
问题来自于您没有正确清理清单。
每次删除空结果列表时,如果之后的那个也为空,则不会检查它。
快速修复:
for (int i = 0; i < dataList.size(); i++) {
if (dataList.get(i).getResultList() == null) {
dataList.remove(i);
i--;
}
}
更新:
List<List<String>> ar_List = new ArrayList<List<String>>();
当你使用它时,列表是空的,所以当你调用:ar_List.get(i)
Java将抛出一个如javadoc中所述的IndexOutOfBoundsException:
&GT;
获取
E get(int index)
返回此列表中指定位置的元素。
参数: index - 要返回的元素的索引
返回: 此列表中指定位置的元素
抛出: IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; = size())
答案 3 :(得分:0)
如果你有一个列表{“value”,null,null,“value”},那么在索引1处删除null,索引1处会有另一个空值,但你继续在索引2处检查。
当您通过索引删除对象时,您将不得不在之后递减索引。尝试
dataList.remove(i--);