Java中的NullPointerException数组列表

时间:2014-03-16 07:08:00

标签: java nullpointerexception

我正在进行Java练习,试图提高我乏善可陈的编程技巧。我已经构建了一个Items数组(每个Item都包含一个项目的名称和价格)。这是在我的GroceryBill类中完成的,并且数组似乎已经有效。然后我将项添加到数组中,但是当我尝试获取数组的总数时,我得到NullPointerException。将它缩短到相关部分(如果我遗漏任何重要的东西,我可以编辑它)。

这是主类中的代码。

public class InheritanceDiscountBill {
    public static void main(String[] args){
    // TODO code application logic here
    GroceryBill checkout1 = new GroceryBill();
    Item orange = new Item("Orange", 0.50);
    Item pie = new Item("Pie" , 2.49);
    checkout1.addItem(orange);
    checkout1.addItem(pie);
    checkout1.getTotal();
    }    
}

项目类

public class Item{
    private String name;
    private double price;

    public Item (String n, double p){
        name = n;
        price = p;
    }

    public String getName(){
        return name;
    }

    public double getPrice(){
        return price;
    }
}

GroceryBill类

public class GroceryBill {
Item[] groceryBill;
int counter;

public GroceryBill(){
    groceryBill = new Item[10];
    counter = 0;
}

public void addItem(Item i){   
    groceryBill[counter] = i;
    counter++;
}

public double getTotal(){
    double totalCost = 0;
    for (Item i : groceryBill){
        totalCost = totalCost + i.getPrice();
        System.out.println(i.getPrice());
    }
    return totalCost;
    }   
}

它一直出现Null指针异常并指向我调用checkout1.getTotal()方法然后调用totalCost = totalCost + i.getPrice();.

是因为列表不满,所以它在列表中迭代时会得到空值吗?如果是这样,我该如何阻止这种情况发生?我对此非常陌生,所以请放轻松并简单地解释一下。我已经阅读了这个主题,但我仍然对我做错了什么感到迷茫。

2 个答案:

答案 0 :(得分:3)

你不能正常使用getTotal中的for-each循环,因为你的数组有空元素:

//                     vv
groceryBill = new Item[10];

您只需向列表中添加两个项目,因此元素2-9都为空。因此,请使用直到counter的常规循环。

for(int i = 0; i < counter; i++) {
    // do stuff with groceryBill[i]
}

使用for-each循环你必须做这样的事情:

for(Item item : groceryBill) {
    if(item != null) {
        // do stuff with non-null element
    }
}

但这有点过分,因为你的迭代比你需要的更远。

答案 1 :(得分:2)

正如Radiodef所说,你的数组被初始化为一个10长度的数组但后来你只初始化了它的2个元素,所以当你在2个循环之后循环它时你试图运行一个空对象的函数

如果您只是在当前代码中添加一行代码,那么您也可以使用for-each循环并且它可以正常工作,只需检查项目是否为空,这样您就不需要了要知道你初始化了多少元素,但是当你在GrocerryBill类中存储计数器时,为什么不把它用作Radiodef所说的

  public double getTotal(){
     double totalCost = 0;
     for (Item i : groceryBill){
          if ( i != null ){ 
               totalCost = totalCost + i.getPrice();
               System.out.println(i.getPrice());               
           }
      }
     return totalCost;
     }