try-catch的Java ArrayList问题

时间:2013-10-03 08:17:10

标签: java arraylist

我想清除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。我有什么麻烦?

7 个答案:

答案 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,循环将终止。

选项:

  • end 而不是 start 中删除,以避免重新排序(并提高效率)
  • 始终从前面中删除,直到大小为0

例如:

// 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后,列表的大小都会发生变化。

所以,事件如下:

  1. 列表大小为3。
  2. 您致电list.remove(0)
  3. 列表大小为2。
  4. 您致电list.remove(1)
  5. 列表大小为1。
  6. 由于i现在是2,因此i&gt; list.size(),所以循环停止。
  7. 列表中仍有一个元素。

答案 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()部分。每次删除项目时,列表的大小减少1i也增加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: