2012-08-31 43 views
0

我有這個項目類沒有能力將項目

public class Item { 

    private String id; 
    private int count; 
    private String name; 


    public int getcount() { 
     return this.count; 
    } 

    public Item(String name) { 
     this.name=name; 
     this.id = ""; 
    } 

    public Item(String id, String name) { 
     this.name=name; 
     this.id=id; 
    } 

    public Item(int count) { 
     this.count=count; 
    } 

    public String getItemName() { 
     return this.name; 
    } 

    public String getItemId() { 
     return this.id; 
    } 

} 

然後我有套裝類,它包含的項目列表

public class ItemSet extends ArrayList<Item> { 

    private List<Item> hold; 

    ItemSet(Item item) { 
     this.hold.add(item); 
    } 

    ItemSet() { 
     //throw new UnsupportedOperationException("Not yet implemented"); 
    } 


    public List<Item> getItemSet() { 
     return this.hold; 
    } 
} 

我有交易班組長其中將包含項目集列表:

public class Transaction extends ArrayList<ItemSet> { 

    // ArrayList<String> l; 
    public ItemSet getUniqueItem() { 
     ResultSet rs; 
     Database d=new Database(); 
     ItemSet unique=new ItemSet(); 
     unique.clear(); 
     String query="Select id,name from item"; 
     rs=d.sendQuery(query); 
     try{ 
      while(rs.next()) { 
       //System.out.println(rs.getString(1)+"\t"+rs.getString(2)); 
       Item item=new Item(rs.getString(1),rs.getString(2)); 
       unique.add(item);   
      } 
     }catch(Exception e){ 
      System.out.print(e.getMessage()); 
     } 

     for(Item item:unique) { 
      // System.out.println(item.getItemId()+": "+item.getItemName()); 
     } 
     return unique; 
    } 

    public int countItems(ItemSet itemset) { 
     ResultSet rs; 
     Database d=new Database(); 
     String query=""; 
     int count=0; 
     for(Item i:itemset) { 
      String id=i.getItemId(); 
      query="SELECT count(*) FROM `item_transaction` where item_id="+i; 
      rs=d.sendQuery(query); 
      try { 
       while(rs.next()) { 
        //System.out.print(rs.getString(1)); 
        count=Integer.parseInt(rs.getString(1)); 
        System.out.print(count+"\t"); 
       } 
      }catch(Exception e){ } 
     } 

     return count; 
    } 

} 

這是主要班組長

public class Ap { 

    public static void main(String args[]) { 
     Transaction t=new Transaction(); 
     Transaction Ci=new Transaction(); 
     Transaction Li=new Transaction(); 

     ItemSet I=t.getUniqueItem(); 
     for(Item i:I) { 
      System.out.println(i); 
      ItemSet itemSet=new ItemSet(i); 
      Ci.add(itemSet); 
     } 

     for(ItemSet itemSet:Ci) { 
      int x=t.countItems(itemSet); 
      System.out.print(x+"\t"); 
     } 

     /* Iterator iter=Li.iterator(); 
      while(iter.hasNext()) { 
       // System.out.print(iter.next()+"\t"); 
      } 
     */ 

    } 
} 

問題是,我得到

Exception in thread "main" java.lang.NullPointerException 
at ItemSet.<init>(ItemSet.java:25) 
at Ap.main(Ap.java:30) 

ItemSet.java:25this.hold.add(item);

,並在那裏

Ap.java:30ItemSet itemSet=new ItemSet(i); // creating new ItemSet

請幫我找到我的錯誤。

回答

5
this.hold.add(item); 

hold (List)是默認情況下將null因爲實例變量。您需要在添加項目之前實例化。你null執行過什麼操作導致NullPointerException

例子:

ItemSet(Item item) 
{ 
    hold = new ArrayList<Item>(); 
    this.hold.add(item); 

} 

任何具體理由延長ArrayList()?

+0

因此,我可以舉行物品清單。我錯了使用ArrayList? – Nyfer

+1

您不需要擴展ArrayList來保存項目。你可以像上面的例子那樣實例化。如果您想要覆蓋功能(或)使用超類屬性,則應該擴展一個類。但是,在這種情況下,你也沒有做。所以,不需要延長。 – kosa

+0

好的感謝信息。就像你說的那樣。但是現在我無法迭代ItemSet I,其中包含項目 ItemSet I = t。getUniqueItem(); 如何去關於它 – Nyfer

2

試試這個:

private List<Item> hold = new ArrayList<Item>(); 

ItemList類中。

到目前爲止,你寫的只是一個私人字段定義 - 你沒有實例化hold對象(即你沒有創建列表),所以hold爲空,因此是NPE。

1

未初始化hold List,使用前...

使用在ItemSet下面的代碼初始化hold

private List<Item> hold = new ArrayList<Item>();

+0

與你的答案無關。爲什麼不編輯現有的答案?我看到一個被刪除的和一個主動的答案。只是想確保它不是系統中的錯誤。 – kosa