2013-04-07 88 views
2

我試圖從線程列表中刪除一個值。但是代碼失敗並給出一個例外。 plz幫助我在線程編程初學者.....從ArrayList刪除項目時出錯

這是Test.java

import java.util.*; 

public class Test { 
    private static final List<Integer> Values = new ArrayList<Integer>(); 
    public static void main(String args[]) { 
     TestThread t1 = new TestThread(Values); 
     t1.start(); 

     System.out.println(Values.size()); 
    } 
} 

此內容是TestThread.java

import java.util.*; 

public class TestThread extends Thread { 
    private final List<Integer> Values; 

    public TestThread(List<Integer> v) { 
     this.Values = v; 
     Values.add(5); 
    } 

    public void run() { 
     Values.remove(5); 
     System.out.println("5 removed"); 
    } 
} 
+0

什麼是錯誤? – BobTheBuilder 2013-04-07 06:43:55

+0

什麼是異常,是什麼原因造成的? – drewmoore 2013-04-07 06:43:59

+0

1Exception在線程 「線程0」 java.lang.IndexOutOfBoundsException:指數:5,大小:1 \t在java.util.ArrayList.rangeCheck(ArrayList.java:603) \t在java.util.ArrayList.remove (ArrayList.java:444) \t at TestThread.run(TestThread.java:12) – khirod 2013-04-07 06:45:27

回答

3

這條線是指:在索引5刪除值。但是,有沒有在指數5

Values.remove(5); 

,因爲這條線意味着增加值5到我的列表,而不是增加5個值進入我的列表有1只目前在數組中值。

Values.add(5); 

您的錯誤很可能是IndexOutOfBoundsException。如果顯示列表的大小,您會更清楚地看到它。

public void run() { 
    System.out.println(Values.size()); // should give you 1 
    Values.remove(5); 
    System.out.println("5 removed"); 
} 

這是它的外觀:

enter image description here

當它被插入,5得到自動裝箱成Integer對象。因此,要成功刪除它,你應該將它包裝成一個:new Integer(5)。然後發出刪除呼叫。然後它將調用接受Object的remove的重載版本,而不是int。

Values.remove(new Integer(5)); 

手段取下我的名單命名爲 '5' 的Integer對象。

+1

+1爲好解釋:) – Maroun 2013-04-07 06:57:46

1

您的來電Values.remove(5); ISN內容不要做你期望的事情。你在參數中傳遞的int是一個索引值,所以它試圖刪除你的數組列表中的索引5處的項目,但其中只有1個值。

一種解決方法,使你刪除一給定值

int given = 5; 
for (int curr = 0; curr < Values.size(); curr++){ 
    if (Values.get(curr) == given) { 
     Values.remove(given); 
    } 
} 
2

List#remove(int)方法在從列表中指定位置移除元件的一個整數,所以Values.remove(5)將嘗試在索引5元件,其元件確實以除去在那裏存在。這裏int值5不會自動裝箱,因爲List#remove(int)已經存在。

您應該使用List#remove(Object o)其中實際上Values.remove(new Integer(5))

public void run() { 
    Values.remove(new integer(5)); 
    System.out.println("5 removed"); 
} 
+0

歡迎您:) :) – 2013-04-07 06:52:59

1

List (ArrayList)有2種remove方法(過載)

  1. remove(int) - >這意味着在索引中刪除
  2. remove(Object) - >這意味着從列表中刪除所述特定對象

當您說Values.remove(5)時,編譯器將5作爲int並調用remove(int)方法,該方法試圖在索引5.自索引5,dint有任何值,IndexOutOfBoundException被拋出。

要解決它,比如說remove(new Integer(5)),要編譯器,調用remove(Object)方法。 爲了更加清晰,請參閱SO thread