我想清除try-catch中的ArrayList。我知道我们可以用clear()
方法做到这一点。但是当我尝试用for循环清除每个项目时。它显示如下结果:
public class ArrayListTryCatch {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList();
int oldsize = list.size();
try {
list.add(20);
list.add(30);
list.add(40);
int wrongDivide = 1 / 0;
} catch (Exception e) {
for (int i = 0; i < list.size(); i++) {
System.out.println("deleted item: " + list.get(oldsize));
list.remove(i);
}
}
System.out.println(list.size());
System.out.println("after try catch: ");
for (Integer e : list) {
System.out.println(e);
}
}
}
结果是:
deleted item: 20
deleted item: 30
1
after try catch:
30
我认为它必须是空的ArrayList。我有什么麻烦?
答案 0 :(得分:4)
问题与try / catch无关,而且与此循环有关:</ p>
for (int i = 0; i < list.size(); i++) {
System.out.println("deleted item: " + list.get(oldsize));
list.remove(i);
}
这只会删除所有其他元素。 (它还会打印不同于实际删除的项目,这很奇怪......)
假设您从A,B,C,D,E开始。
在第一次迭代中,i
将为0,大小将为5,并且您将删除A.这将留下B,C,D,E。
在第二次迭代中,i
将为1,大小将为4,您将删除C(现在位于第1位)。这将留下B,D,E。
在第三次迭代中,i
将为2,大小将为3,您将删除E(现在位于第2位)。这将离开B,D。
接下来,i
将为3,大小为2,循环将终止。
选项:
例如:
// Work from the back...
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println("deleted item: " + list.get(i));
list.remove(i);
}
或(效率较低):
while (list.size() > 0) {
System.out.println("deleted item: " + list.get(0));
list.remove(0);
}
答案 1 :(得分:1)
您需要记住,每次调用list.remove后,列表的大小都会发生变化。
所以,事件如下:
list.remove(0)
list.remove(1)
i
现在是2,因此i&gt; list.size(),所以循环停止。列表中仍有一个元素。
答案 2 :(得分:1)
你不能这样做:
for (int i = 0; i < list.size(); i++) {
System.out.println("deleted item: " + list.get(oldsize));
list.remove(i);
}
因为每次删除元素时,列表大小都会发生变化,所以列表的最后一个元素不会改变。
答案 3 :(得分:1)
/*
* On the first step, you delete 20.
* So the list is [30, 40]
*
* On the second step, you delete at index 1
* so you delete 40.
*
* Then i becomes > list.size() => the loop stops
*/
for (int i = 0; i < list.size(); i++) {
System.out.println("deleted item: " + list.get(oldsize));
list.remove(i);
}
编辑:我忘了写:
非常不鼓励在不使用迭代器的情况下循环编辑列表。所以
List.clear();
Iterator
并使用Iterator删除元素#remove();如果你只想删除几个元素。答案 4 :(得分:0)
问题出在i < list.size()
部分。每次删除项目时,列表的大小减少1
,i
也增加1
。因此,i
在列表为空之前会大于list.size()
。
实际发生的是:
1. i = 0, list is [20, 30, 40], list.size() returns 3, i < 3 and 20 is deleted
2. i = 1, list is [30, 40], list.size() returns 2, i < 2 and 40 is deleted
3. i = 2, list is [30], list.size() returns 1, i > 1 and 30 is NOT deleted,
loop breaks here
答案 5 :(得分:0)
用此替换catch代码应该可以工作并简化代码:
catch (Exception e) {
list=new ArrayList();
}
答案 6 :(得分:0)
正如其他人所说,您应该知道问题是什么,但是作为可选,只需从循环中删除i++
即可使代码正常工作,例如:
for (int i = 0; i < list.size();) {
System.out.println("deleted item: " + list.get(oldsize));
list.remove(i);
}
<强>输出:强>
deleted item: 20
deleted item: 30
deleted item: 40
0
after try catch: