Я разработал межсерверный протокол CCMN и различные политики отбрасывания для сообщений, кэшируемых каждым сервером. Симулятор PEERSIM создает узел шаблона с протоколом CCMN, а затем клонирует этот узел шаблона.
Класс CCMN включает в себя различные структуры данных, поддерживающие состояния, необходимые для реализации политик отбрасывания. Например, Pmap разрешает идентификатор контента в объект контента, а freq идентификатор контента - количество раз, которое объект контента использовался.
public HashMap <String, Content> Pmap;
public HashMap<String, Integer> freq;
Инициализация этих структур данных выполняется методом клонирования CCMN. Для поддержки политик отбрасывания я использую priorityQueue, инициализированный компаратором, соответствующим используемой политике. В методе клонирования:
if(dp.equals(DroppingPolicy.LFU)){
lfu less_frequent = new lfu ();
av.raw_drop = new PriorityQueue (1, less_frequent);
}
Компаратор объявляется следующим образом:
public class lfu implements Comparator<String> {
public int Compare (Строка s0, Строка s1) {
if (freq.get (s0)> freq.get (s1)) возвращает 1;
иначе if (freq.get (s0)
Проблема в том, что я получаю исключение NullPointerException при вызове:
raw_drop.add(ct.getID());
Путем отладки я обнаружил, что добавление работает для первого элемента, но исключение возникает при добавлении второго элемента. Я проследил исключение для метода сравнения, проверив переменные, которые я обнаружил, что переменная freq (и другие переменные, инициализированные в методе clone) равны null , тогда как переменные, определенные в конструктор четко определен.
Кроме того, я проверяю, что freq хорошо инициализируется перед вызовом add .
Я полагаю, что существует проблема между определением компараторов как встроенных классов и методом клон .
Любая помощь приветствуется.
С уважением, Мохамед