2013-10-03 42 views
1

我想清除try-catch中的ArrayList。我知道我們可以用clear()方法來做到這一點。但是當我嘗試用for循環清除每個項目時。它顯示如下結果:用try-catch Java ArrayList問題

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。我有什麼麻煩?

回答

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並刪除與迭代器#刪除)元素(;如果你只想刪除幾個元素。
1

您需要記住,每次調用list.remove後,列表的大小都會發生變化。

因此,事件有以下幾種:

  1. 列表大小爲3
  2. 你叫list.remove(0)
  3. 列表的大小是2
  4. 你叫list.remove(1)
  5. 列表大小爲1
  6. 由於i現在是2,i> list.size(),因此循環停止。

您的列表中仍然有一個元素。

4

的問題無關,與try/catch語句,一切都與這個循環做:

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,循環將終止。

選項:

  • 代替開始取出,以避免重排序(並提高效率)
  • 務必從除去,直至大小爲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); 
} 
+0

第一種方式應該是我 - – haind

+0

@haind:Doh--修好了,謝謝。 –

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 
1

你不能做到這一點:

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

因爲每次你刪除一個元素,列表大小的變化,所以列表的最後一個元素不會改變。

0

此更換捕撈代碼應工作,並簡化代碼:

catch (Exception e) { 
     list=new ArrayList(); 
    } 
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: