J'ai développé un protocole de serveur à serveur appelé CCMN et différentes politiques de dépôt pour les messages mis en cache par chaque serveur. Le simulateur PEERSIM crée un noeud de modèle avec le protocole CCMN, puis clone ce noeud de modèle.en utilisant des comparateurs comme classes incorporées, les champs de classe mère (initialisée en clone) ne sont pas visibles dans la méthode de comparaison
La classe CCMN comprend différentes structures de données conservant les états requis pour implémenter les stratégies de suppression. Par exemple, Pmap résout un identificateur de contenu à un objet de contenu, et freq un identifiant de contenu au nombre de fois qu'un objet de contenu a été utilisé. L'initialisation de ces structures de données est effectuée dans la méthode de clonage de CCMN. Afin de supporter les politiques de suppression, j'utilise une priorityQueue initialisée avec un comparateur correspondant à la politique à utiliser. Dans la méthode de clonage:
if(dp.equals(DroppingPolicy.LFU)){
lfu less_frequent = new lfu(); av.raw_drop = new PriorityQueue (1, less_frequent); } Le comparateur sont déclarés comme suit:
public class lfu implements Comparator<String> {
public int comparer (String s0, String s1) { if (freq.get (s0)> freq.get (s1)) return 1; sinon if (freq.get (s0)freq.get (s1)) renvoie -1; sinon retour 0; } }
Le problème est que je reçois une exception NullPointerException quand je l'appelle:
raw_drop.add(ct.getID());
par le débogage, je trouve que l'ajout fonctionne pour le premier élément, mais l'exception se produit lorsqu'un deuxième élément est ajouté. J'ai tracé l'exception à la méthode de comparaison, en vérifiant les variables, je trouve que la variable freq (et les autres variables initialisées dans la méthode clone) est égale à null, alors que les variables définies dans le constructeur sont bien définies.
De plus, je vérifie que fréq est bien initialisé avant la ajouter appel.
Je suppose qu'il existe un problème entre la définition des comparateurs en tant que classes incorporées et la méthode clone.
Toute aide est la bienvenue.
Cordialement, Mohamed
Désolé pour un commentaire assez similaire, mais pourquoi utilisez-vous un tel comparateur? N'est-il pas plus facile d'écrire return freq.get (s0) .compareTo (freq.get (s1)); ? – dchekmarev