带有try-catch的Java ArrayList问题
我想清除try catch中的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();
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后,列表的大小都会发生变化 因此,事件如下:
列表。删除(0)
列表。删除(1)
i
现在是2,所以i>list.size(),所以循环停止列表中仍有一个元素。您需要记住,每次调用list.remove后,列表的大小都会发生变化 因此,事件如下:
列表。删除(0)
列表。删除(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 (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);
}
第一条路应该是我,第一条路应该是我--