2

我正在尝试使用线程从列表中删除一个值。但是代码失败并给出了异常。请帮助我是线程编程的初学者.....

这是内容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");
    }
}
4

4 回答 4

4

此行表示:删除索引 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 而不是 int 的 remove 的重载版本。

Values.remove(new Integer(5));

表示从我的列表中删除名为“5”的整数对象

于 2013-04-07T06:47:20.453 回答
2

List#remove(int)方法从列表中删除指定位置的元素,因此Values.remove(5)将尝试删除索引 5 处确实存在的元素。这里的int值 5 不会像List#remove(int)已经存在的那样被自动装箱。

你应该使用List#remove(Object o) which 实际上Values.remove(new Integer(5))

public void run() {
    Values.remove(new integer(5));
    System.out.println("5 removed");
}
于 2013-04-07T06:47:16.017 回答
1

你的电话Values.remove(5);没有做你期望它做的事情。您传入参数的 int 是一个索引值,因此它试图删除数组列表中索引 5 处的项目,但其中只有 1 个值。

一种解决方法,使您能够删除给定值的整数

int given = 5;
for (int curr = 0; curr < Values.size(); curr++){
    if (Values.get(curr) == given) {
         Values.remove(given);
    }
}
于 2013-04-07T06:46:41.767 回答
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 线程以获得更清晰的信息。

于 2013-04-07T07:01:28.933 回答