我开发了一种名为 CCMN 的服务器到服务器协议(protocol),并为每个服务器缓存的消息提供了不同的丢弃策略。 PEERSIM模拟器使用CCMN协议(protocol)创建一个模板节点,然后克隆该模板节点。
CCMN 类包括维护实现丢弃策略所需状态的不同数据结构。例如,Pmap 将内容标识符解析为内容对象,freq 将内容标识符解析为内容对象已使用的次数。
public HashMap <String, Content> Pmap;
public HashMap<String, Integer> freq;
这些数据结构的初始化是在CCMN的clone方法中完成的。为了支持删除策略,我使用了一个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 比较(字符串 s0,字符串 s1){ if(freq.get(s0) > freq.get(s1)) 返回 1; 否则 if(freq.get(s0) < freq.get(s1)) 返回 -1; 否则返回0; } }
问题是当我调用时遇到 NullPointerException 异常:
raw_drop.add(ct.getID());
通过调试,我发现添加对第一个元素有效,但是当添加第二个元素时出现异常。我将异常追溯到比较方法,通过检查变量,我发现 freq 变量(以及在克隆方法中初始化的其他变量)等于 null,而变量在构造函数中定义的都是明确定义的。
此外,我检查 freq 在 add 调用之前是否已正确初始化。
我猜想比较器作为嵌入类的定义和克隆方法之间存在问题。
欢迎任何帮助。
问候,穆罕默德
最佳答案
好的,但这不会改变任何问题,因为问题是 freq 没有在比较方法中初始化......
关于java - 使用比较器作为嵌入类,母类(在克隆中初始化)字段在比较方法中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3650809/