2013-04-30 151 views
0

我正在開發一個Java項目,目前有4個類(Driver,OrdersProcessor,Items和Purchase) ,當我運行測試時,它告訴我,我有一個NullPointerException兩行旁邊有(** * **)。 我不知道這有什麼錯他們雖然..Java空指針異常

public class OrdersProcessor { 

private static Items items = null; 

//added 
    items = new Items(numOrders); 

public static void runOrderProcessor(BufferedReader file, int id) { 
    double grandTotal = 0; 
    int clientId = 1000 + id; 
    try { 
     System.out.println("Reading order for client with id: " + clientId); 
     file.readLine(); 
     while (true) { 
      grandTotal += items.buy(file.readLine().split(" ")[0], id); (*****) 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     file.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    StringBuffer writeReport = new StringBuffer(); 
    writeReport.append("----- Order details for client with Id: " 
      + clientId + " -----" + "\n"); 
    for (String bought : items.allItems()) { 
     writeReport.append("Item's Name: " + items.getItem(bought) 
       + items.getItem(bought).recipt(id)); 
     writeReport.append("Order Total: " 
       + NumberFormat.getCurrencyInstance().format(grandTotal) 
       + "\n"); 
    } 

} 

}

而其他類:

public class Items { 

private Map<String, Purchase> items; 
private double grandTotal; 
private int numOrders; 

public Items(int numOrders) { 
    this.numOrders = numOrders; 
    reportOrders = new TreeMap <Integer, String>(); 
    items = new TreeMap<String, Purchase>(); 
    grandTotal = 0; 

public double buy(String name, int id) { 
    double price = getItem(name).purchaseItem(id); (*****) 
    synchronized (lockGT) { 
     grandTotal = grandTotal + price; 
    } 
    return price; 
} 
+2

調試器和你在一起,小padawan – DGomez 2013-04-30 21:35:42

+0

你在'OrdersProcessor'中初始化'items'在哪裏? – 2013-04-30 21:36:11

+0

我有 private static Items items = null; 在一開始,這是不夠的? – CCC 2013-04-30 21:38:21

回答

1

它看起來像在第一種情況下items從未設置爲值並保持爲空。
在第二種情況下,getItem(name)已返回null,因此對.purchaseItem(id)的調用失敗。

爲了方便調試,您可以在eclipse中設置斷點(或者使用w.e)或在這些行之前向控制檯輸出幾條日誌消息,以查看對象的當前值。

0

項目在第一個類中定義爲null。你需要實例化這個。

對於第二個問題,你應該避免在一行中做到這一點。 getItem()可能返回null。將它分成兩個單獨的語句並添加空檢查。代碼安全或確保開發人員能夠從方法中返回(如果有的話)的測試。