带有try-catch的Java ArrayList问题

带有try-catch的Java ArrayList问题,java,arraylist,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 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);
        }
    }
}

我想它一定是空的ArrayList。我遇到的问题是?

您需要记住,每次调用list.remove后,列表的大小都会发生变化

因此,事件如下:

  • 列表大小为3
  • 您可以调用
    列表。删除(0)
  • 列表大小为2
  • 您可以调用
    列表。删除(1)
  • 列表大小为1
  • 因为
    i
    现在是2,所以i>list.size(),所以循环停止

  • 列表中仍有一个元素。

    您需要记住,每次调用list.remove后,列表的大小都会发生变化

    因此,事件如下:

  • 列表大小为3
  • 您可以调用
    列表。删除(0)
  • 列表大小为2
  • 您可以调用
    列表。删除(1)
  • 列表大小为1
  • 因为
    i
    现在是2,所以i>list.size(),所以循环停止

  • 列表中仍有一个元素。

    问题与try/catch无关,与此循环有关:

    for (int i = 0; i < list.size(); i++) {
        System.out.println("deleted item: " + list.get(oldsize));
        list.remove(i);
    }
    
    或(效率较低):


    问题与try/catch无关,与此循环有关:

    for (int i = 0; i < list.size(); i++) {
        System.out.println("deleted item: " + list.get(oldsize));
        list.remove(i);
    }
    
    或(效率较低):


    问题出在零件
    i
    中。每次删除项目时,列表的大小都会减少
    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
    
    1。i=0,list是[20,30,40],list.size()返回3,i<3,20被删除
    2.i=1,list是[30,40],list.size()返回2,i<2,40被删除
    3.i=2,list为[30],list.size()返回1,i>1,30未被删除,
    循环在此中断
    
    问题出在零件
    i
    中。每次删除项目时,列表的大小都会减少
    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
    
    1。i=0,list是[20,30,40],list.size()返回3,i<3,20被删除
    2.i=1,list是[30,40],list.size()返回2,i<2,40被删除
    3.i=2,list为[30],list.size()返回1,i>1,30未被删除,
    循环在此中断
    
    您不能这样做:

    for (int i = 0; i < list.size(); i++) {
    System.out.println("deleted item: " + list.get(oldsize));
    list.remove(i);
    }
    
    for(int i=0;i
    因为每次删除元素时,列表大小都会更改,因此列表的最后一个元素不会更改。

    您不能这样做:

    for (int i = 0; i < list.size(); i++) {
    System.out.println("deleted item: " + list.get(oldsize));
    list.remove(i);
    }
    
    /*
     * 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);
    }
    
    for(int i=0;i
    因为每次删除一个元素时,列表大小都会改变,所以列表的最后一个元素不会改变。

    /*
    
    /*
     * 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);
    }
    
    *在第一步中,删除20。 *所以这个列表是[30,40] * *在第二步中,删除索引1处的内容 *所以你删除了40个。 * *然后我变成>list.size()=>循环停止 */ 对于(int i=0;i
    编辑:我忘了写:

    不建议在不使用迭代器的情况下在列表上循环时编辑列表。所以

    • 使用
      list.clear()清除列表
    • 或者使用
      迭代器
      并使用迭代器#remove()删除元素;如果只想删除几个元素
    /*
    *在第一步中,删除20。
    *所以这个列表是[30,40]
    *
    *在第二步中,删除索引1处的内容
    *所以你删除了40个。
    *
    *然后我变成>list.size()=>循环停止
    */
    对于(int i=0;i
    编辑:我忘了写:

    不建议在不使用迭代器的情况下在列表上循环时编辑列表。所以

    • 使用
      list.clear()清除列表
    • 或者使用
      迭代器
      并使用迭代器#remove()删除元素;如果只想删除几个元素

    用它代替catch代码应该可以工作并简化代码:

    catch (Exception e) {
            list=new ArrayList();
        }
    

    用此替换catch代码应该可以工作并简化代码:

    catch (Exception e) {
            list=new ArrayList();
        }
    

    正如其他人所说,您应该知道问题是什么,但作为可选的,您只需从循环中删除
    i++
    ,即可使代码正常工作,如:

    for (int i = 0; i < list.size();) {
            System.out.println("deleted item: " + list.get(oldsize));
            list.remove(i);
    }
    

    正如其他人所说,您应该知道问题是什么,但作为可选的,您只需从循环中删除
    i++
    ,即可使代码正常工作,如:

    for (int i = 0; i < list.size();) {
            System.out.println("deleted item: " + list.get(oldsize));
            list.remove(i);
    }
    

    第一条路应该是我,第一条路应该是我--