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