2009-08-03 16 views
0

HashMapListはその要素をHashMap内に保持します。addメソッドを呼び出すと、このエラーメッセージが"スレッド内の例外 "メイン" java.lang.NullPointerExceptionが"スレッドmain" java.lang.NullPointerExceptionの例外 "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); 

} 
} 

おかげで、私は最初の問題を解決したが、私は==>

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

とBookクラス==>

あるようにメソッドを追加呼び出すとき
public class Book extends Product { 
public String name = null; 
public Book(String name) { 
    super(name); 

    } 
} 

とProductクラス==>

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; 
    } 
} 

と私は思いのSystem.out.println(リスト)と基本的には、このリストを印刷したいとき。 この文はconcoleに表示されます。[[email protected][email protected][email protected]]

+0

上記のコードのほんの少しのポインタ...製品名がnullのような新しい例外を投げるとき、常にこのnullが起こらない理由を説明する文字列をコンストラクタに入れてください。時には些細なことかもしれませんが、後で自分のログを読んでいるときは、クラスとメソッドを正しく使用しなかったことを自分自身に説明することから感謝します。これは、 "恥ずかしがり屋ここに投げ込まれたこの例外は..."から "時代遅れの私はコンストラクタを呼び出す前に変数を代入するのを忘れた"というような時間の節約になります – Newtopian

+0

別のポインタ:各子孫でname変数を再宣言するのではなく、それを保護するか、製品レベルでアクセサーを作成します。あなたがそれをやっているやり方はほとんどの場合はうまくいくでしょうが、データが含まれている親の変数であるときに、コードが子の名前変数にアクセスしているときに、あなたは奇妙な副作用を受けるでしょう。とにかく...私の2セント:-) – Newtopian

+0

マップ=新しいハッシュマップ(...問題? – CsTamas

答えて

2

する必要があり、あなたは本当に別のスレッドを開始する必要があります。これは、オブジェクトの文字列表現を正しく表示しています。 Bookクラスは、オーバーライドされたカスタムオーバーライドtoString()メソッドを提供しません。したがって、それはObjectから継承されたものを使用します。これはクラスのフルネームで作られた文字列とオブジェクトのhashCodeを返します。これはあなたが見ているものです。異なるものを表示する場合は、toString()メソッドをオーバーライドする必要があります。

+0

)を修正してもまだ間違っていることは、toString()メソッドを意味しています。 .toString()ではなく、メソッドはピリオドで開始できません。 –

3

あなたはありませんあなたが使用しているあなたに、変数に値を代入どこにnullポインタ例外の外観を得るたび

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

をマッピングするために何かを割り当てます。ここであなたのコードのどこかを探して、 "map = ..."と言ってください。

2

あなたのコンストラクタを見てください。

new HashMap<Integer, V>(); 

はあなたの2番目の質問については

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