1

我开发了一种称为 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是否已很好地初始化。

我猜想将比较器定义为嵌入式类和克隆方法之间存在问题。

欢迎任何帮助。

问候, 穆罕默德

4

2 回答 2

0

好的,但这不会改变任何问题,因为问题是在 compare 方法中没有初始化 freq ......

于 2010-09-06T11:13:11.537 回答
0

我已经解决了这个问题。事实上,嵌套的比较器引用了模板实例而不是克隆的实例。我添加了一个计数器,以便在第一次时,指令raw_drop.add(ct.getID())所属的方法被称为priorityQueue,实例使用的优先级队列被初始化,以便进行正确的初始化。

于 2010-09-07T10:00:10.120 回答