我正在尝试使用线程从列表中删除一个值。但代码失败并给出了异常。 Plz帮助我成为线程编程的初学者......
这是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 :(得分:3)
此行表示:删除索引5处的值。但索引5中没有任何内容。
Values.remove(5);
目前数组中只有1个值,因为此行表示将值5添加到我的列表中,而不是将5个值添加到我的列表中。
Values.add(5);
您的错误很可能是IndexOutOfBoundsException
。如果您显示列表的大小,您会更清楚地看到它。
public void run() {
System.out.println(Values.size()); // should give you 1
Values.remove(5);
System.out.println("5 removed");
}
它的外观如下:
插入时,5自动装入Integer对象。因此,要成功删除它,您应该将其包装成一个:new Integer(5)
。然后发出删除电话。然后它将调用接受Object的重载版本的remove,而不是int。
Values.remove(new Integer(5));
表示从列表中删除名为“5”的整数对象。
答案 1 :(得分:2)
List#remove(int)
方法从列表中删除指定位置的元素,因此Values.remove(5)
将尝试在索引5元素处删除哪个元素存在于那里。此处int
值5将不会自动生成,因为List#remove(int)
已存在。
您应该使用实际为List#remove(Object o)
的{{1}}。
Values.remove(new Integer(5))
答案 2 :(得分:1)
您对Values.remove(5);
的致电未达到您的预期。您在参数中传递的int是索引值,因此它尝试删除arraylist中索引5处的项目,但其中只有1个值。
一种解决方法,可让您删除给定值的整数
int given = 5;
for (int curr = 0; curr < Values.size(); curr++){
if (Values.get(curr) == given) {
Values.remove(given);
}
}
答案 3 :(得分:1)
在List (ArrayList)中有2个remove
方法(重载)
remove(int)
- &gt;这意味着删除索引remove(Object)
- &gt;这意味着从列表中删除特定对象当你说Values.remove(5)
时,编译器将5作为int
并调用remove(int)
方法,该方法试图删除索引5处的值存储。由于索引5,dint已经任何值,IndexOutOfBoundException
都被抛出。
要解决它,比如remove(new Integer(5))
,要编译,调用remove(Object)方法。
有关更清晰的信息,请参阅此SO thread。