2009-08-03 5 views
0

HashMapList conserve ses éléments dans un HashMap) et quand j'appelle la méthode add ce message d'erreur sera affiché dans la console" Exception dans le thread "main" java.lang.NullPointerException"Exception dans le thread" principal "java.lang.NullPointerException lors de l'ajout à une HashMapList

public class HashMapList<K, V extends Product> extends AbstractList<Product> { 
public V element; 

public int index; 

Map<Integer, V> map; 

public HashMapList() { 
    super(); 
    new HashMap<Integer, V>(); 
} 

// Override 
public void add(int index, V element) { 
    map.put(new Integer(index), element); 

} 
} 

merci, j'ai résolu le premier problème mais quand je l'appelle méthode ajouter comme ==>

HashMapList<Integer, Book> list = new HashMapList<Integer, Book>(); 
list.add(0, new Book("physics")); 

et classe livre est ==>

public class Book extends Product { 
public String name = null; 
public Book(String name) { 
    super(name); 

    } 
} 

et la classe de produit est ==>

public class Product implements Comparable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private String name = null; 

public Product(String name) { 
    if (name == null) 
     throw new NullPointerException(); 
    this.name = name; 
    } 

public String getName() { 
    return name; 
    } 

// Override 

public int compareTo(Object o) { 
    Product product = (Product) o; 
    int compare = getName().compareTo(product.name); 
    return compare; 
    } 
} 

Et quand je veux imprimer cette liste essentiellement avec System.out.println (liste); cette phrase sera affiché dans le concole: [[email protected], [email protected], [email protected]]

+0

juste quelques pointeurs sur le code ci-dessus ... lors du lancement d'une nouvelle exception comme lorsque le nom du produit est nul, mettez toujours une chaîne dans le constructeur qui explique pourquoi cette valeur nulle ne devrait pas arriver. Cela peut sembler trivial parfois mais quand vous lirez vos logs plus tard, vous vous remercierez de vous expliquer que vous n'avez pas utilisé votre classe et vos méthodes correctement. cela vous sauvera des oogles de temps allant de "timide est cette exception jeté ici ..." à "idiot moi ... oublié d'assigner la variable avant d'appeler le constructeur" – Newtopian

+0

Un autre pointeur: au lieu de re déclarer la variable de nom à chaque descendant , soit le rendre protégé ou créer des accesseurs au niveau du produit. La façon dont vous le faites fonctionnera la plupart du temps mais vous obtiendrez des effets secondaires étranges quand le code accède à la variable de nom de l'enfant quand c'est la variable du parent qui contient les données. À droite il y a une bonne source d'exceptions étranges de pointeur nul ... Quoi qu'il en soit ... mes deux cents :-) – Newtopian

+0

Qu'est-ce qui ne va pas après avoir corrigé la carte = new Hashmap (... problème? – CsTamas

Répondre

2

Pour votre deuxième question, vous devriez vraiment commencer un autre thread. Il imprime correctement la représentation de chaîne de votre objet. Votre classe Book ne fournit pas de méthode personnalisée toString() remplacée. Donc, il utilise celui hérité de Object, qui retourne juste une chaîne faite du nom complet de la classe et le hashCode de l'objet, ce qui est ce que vous voyez. Vous devez remplacer la méthode toString() si vous voulez voir quelque chose de différent.

+0

Vous voulez dire toString() et pas .toString(), car les méthodes ne peuvent pas démarrer avec un point. –

3

Vous n'êtes pas attribuer quoi que ce soit à la carte

public HashMapList() { 
    super(); 
    map = new HashMap<Integer, V>(); 
} 

chaque fois que vous obtenez un look d'exception de pointeur nULL pour où vous attribuez une valeur à la variable que vous utilisez. Ici, cherchez n'importe où dans votre code où vous dites "map = ...".

2

Regardez votre constructeur.

new HashMap<Integer, V>(); 

devrait être

map = new HashMap<Integer, V>(); 
Questions connexes