我开发了一种称为 CCMN 的服务器到服务器协议,并为每个服务器缓存的消息开发了不同的丢弃策略。PEERSIM 模拟器使用 CCMN 协议创建一个模板节点,然后克隆这个模板节点。
CCMN 类包括维护实现丢弃策略所需的状态的不同数据结构。例如,Pmap将内容标识符解析为内容对象,并将内容标识符的频率解析为内容对象已被使用的次数。
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());
通过调试,我发现添加对第一个元素有效,但是添加第二个元素时出现异常。我追踪了 compare 方法的异常,通过检查变量我发现freq变量(以及在 clone 方法中初始化的其他变量)等于null,而在构造函数中定义的变量定义良好。
此外,我在add调用之前检查了freq是否已很好地初始化。
我猜想将比较器定义为嵌入式类和克隆方法之间存在问题。
欢迎任何帮助。
问候, 穆罕默德