【问题标题】:Error removing an item from an ArrayList [duplicate]从 ArrayList 中删除项目时出错 [重复]
【发布时间】:2013-03-29 09:20:42
【问题描述】:

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

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

【问题讨论】:

  • 什么是异常,是哪一行导致的?
  • 1 线程“Thread-0”中的异常 java.lang.IndexOutOfBoundsException:索引:5,大小:1 在 java.util.ArrayList.rangeCheck(ArrayList.java:603) 在 java.util.ArrayList .remove(ArrayList.java:444) 在 TestThread.run(TestThread.java:12)

标签: java multithreading


【解决方案1】:

这一行的意思是:删除索引 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)。然后发出删除调用。然后它将调用remove 的重载版本,该版本接受一个Object,而不是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),实际上是Values.remove(new Integer(5))

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

【讨论】:

    【解决方案3】:

    您对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);
        }
    }
    

    【讨论】:

      【解决方案4】:

      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 以获得更清晰的信息。

      【讨论】:

        猜你喜欢
        • 2019-05-12
        • 1970-01-01
        • 2018-05-29
        • 2015-11-02
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多