私は、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メソッドの間に問題があると思います。
どんな助けでも大歓迎です。
よろしく、モハメド