0

Java 6 コレクション API を使用します。N 個の要素のみを持つコレクションが必要です。つまり、新しい要素を追加してコレクションに既に N 個の要素がある場合、最後の要素を削除して新しい要素をコレクションの先頭に追加する必要があります。私はそれを行うために次のコードフラグメントを持っています:

class A {

  int N = 100;
  Deque dq = new LinkedList();

  void add(Object o) {
    synchronized (o) { 
      if (dq.size() == N) {
        dq.pollLast();
      }
      dq.add(o);
    }
  }

  Deque getDq() {
    return new LinkedList(dq);
  }
}

タイプ A のオブジェクトには、多くのユーザーが同時にアクセスして、新しい要素を追加できます。実際には、それで NullPointerException を取得しました。

Caused by: java.lang.NullPointerException
   at java.util.LinkedList.remove(LinkedList.java:790)
   at java.util.LinkedList.removeLast(LinkedList.java:144)
   at java.util.LinkedList.pollLast(LinkedList.java:573)
   at A.add(A.java:9)

Deque.pollLast() コントラクトは NullPointerException について何も述べていません:

このリストの最後の要素を取得して削除するか、このリストが空の場合は null を返します。

また、要素の追加も同期されます。

例外の理由が何であるかを知っている人はいますか?

アイデアをありがとう

4

3 に答える 3

3

構文化は間違ったオブジェクトで行われていると思います!あるべきですが、そうではありdqませんo

... synchronized (dg) { ...
于 2011-04-21T11:18:11.677 に答える
1

次のテストを使用して追加するコードを実行しました

    A a = new A();
    for (int i = 0; i < 200; i++)
    {
        a.add(i);
    }
    System.out.println(a.dq);

そして、それはすべて正しく機能しているようです。NPE を取得したときのアプリケーションの状態について詳しく教えていただけますか? 追加しようとしているオブジェクトは何ですか? その時のデキューの状態は?

また、あなたが言及した

新しい要素を追加し、コレクションにすでに N 個の要素がある場合、最後の要素を削除して新しい要素をコレクションの先頭に追加する必要があります

あなたのコードはそれをしません。現在、コレクションの末尾に追加されています。頭に追加するには、変更します

dq.add(o)

dq.addFirst(o)
于 2011-04-21T11:24:05.660 に答える
0

このjavadocを参照してください

 Removes and returns the last element from this list.

最初にオブジェクトを削除するため、nullの場合はNullPointerExceptionをスローします。

したがって、add(..)メソッドを同期させ、サイズを確認する前にdq.pollLast();

于 2011-04-21T11:15:32.893 に答える