0

我正在开发一个 Java 项目,目前有 4 个类(Driver、OrdersProcessor、Items 和 Purchase),当我运行测试时,它告诉我在两行有一个 NullPointerException (** * * *) 在他们旁边。虽然我不确定他们有什么问题..

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

2 回答 2

1

看起来在第一种情况下items从未设置为值并保持为空。
在第二种情况下getItem(name)返回 null 所以调用.purchaseItem(id)失败。

为了轻松调试,您可以在 eclipse(或我们使用的)中设置断点,或者在这些行之前将一些日志消息打印到控制台,以查看对象的当前值是什么。

于 2013-04-30T21:37:19.530 回答
0

items 在第一类中被定义为 null。你需要实例化它。

对于第二个问题,您应该避免在一行中执行此操作。getItem() 可能返回 null。将其拆分为两个单独的语句并添加空检查。代码安全或用于确保开发人员从方法返回什么(如果有的话)的测试。

于 2013-04-30T21:38:46.563 回答