1

私は、CCMN と呼ばれるサーバー間プロトコルと、各サーバーによってキャッシュされるメッセージの異なるドロップ ポリシーを開発しました。PEERSIM シミュレーターは、CCMN プロトコルを使用してテンプレート ノードを作成し、このテンプレート ノードを複製します。

CCMN クラスには、ドロップ ポリシーの実装に必要な状態を維持するさまざまなデータ構造が含まれています。たとえば、Pmapはコンテンツ識別子をコンテンツ オブジェクトに解決し、freqはコンテンツ オブジェクトが使用された回数に解決します。

public HashMap <String, Content> Pmap;
public HashMap<String, Integer> freq;

これらのデータ構造の初期化は、CCMN の clone メソッドで行われます。ドロップ ポリシーをサポートするために、使用するポリシーに対応するコンパレータで初期化された priorityQueue を使用します。クローンメソッドでは:

if(dp.equals(DroppingPolicy.LFU)){

lfu less_frequent=新しい lfu(); av.raw_drop=new PriorityQueue(1, less_frequent); コンパレータは次のように宣言されます。

public class lfu implements Comparator<String> {

public int compare(String s0, String s1) { if(freq.get(s0) > freq.get(s1)) return 1; そうでなければ if(freq.get(s0) < freq.get(s1)) return -1; それ以外の場合は 0 を返します。} }

問題は、呼び出し時に NullPointerException 例外が発生することです。

raw_drop.add(ct.getID());

デバッグにより、追加は最初の要素に対して機能することがわかりましたが、2 番目の要素が追加されると例外が発生します。コンストラクターで定義された変数は明確に定義されていますが、 freq変数 (および clone メソッドで初期化された他の変数) がnullに等しいことがわかった変数をチェックすることで、compare メソッドへの例外を追跡しました。

さらに、add呼び出しの前にfreqが適切に初期化されていることを確認します。

埋め込みクラスとしてのコンパレータの定義とcloneメソッドの間に問題があると思います。

どんな助けでも大歓迎です。

よろしく、モハメド

4

2 に答える 2

0

わかりました、しかし問題はfreqがcompareメソッドで初期化されないことであるため、これは問題に何も変わりません...

于 2010-09-06T11:13:11.537 に答える
0

問題を修正しました。実際、ネストされたコンパレータは、複製されたインスタンスではなく、テンプレートインスタンスを参照していました。カウンターを追加して、命令がraw_drop.add(ct.getID())属するメソッドが最初に呼び出されるようにします。これは、適切な初期化を行うために、インスタンスによって使用されるpriorityQueueが初期化されるようにします。

于 2010-09-07T10:00:10.120 に答える