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);

この行は値 5 を my listに追加することを意味するため、現在、配列には 1 つの値しかありません。リストに 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 呼び出しを発行します。次に、int の代わりにオブジェクトを受け入れるオーバーロードされたバージョンの remove を呼び出します。

Values.remove(new Integer(5));

「5」という名前の整数オブジェクトをリストから削除することを意味します。

于 2013-04-07T06:47:20.453 に答える
2

List#remove(int)メソッドは、指定された位置にある要素をリストValues.remove(5)から削除するため、要素が存在するインデックス 5 の要素を削除しようとします。ここで、値 5は既に存在するためint、自動ボックス化されません。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 に答える