Я выполняю упражнение на Java, пытаясь улучшить свои тусклые навыки программирования. Я создал массив элементов (каждый элемент имеет имя и цену элемента). Это делается в моем классе 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 pointer и указывает, когда я вызываю метод checkout1.getTotal(), а затем totalCost = totalCost + i.getPrice() ;.
Это потому, что список не заполнен и поэтому он получает нулевые значения, поскольку он выполняет итерацию по списку? Если да, то как я могу остановить это? Я очень новичок в этом, поэтому, пожалуйста, успокойтесь и просто объясните. Я читал об этом по теме, но по-прежнему теряю то, что я делаю неправильно.
Вы не можете использовать цикл for-each в getTotal
обычно, потому что ваш массив имеет нулевые элементы:
// vv
groceryBill = new Item[10];
Вы добавляете только два элемента в список, так что элементы 2-9 имеют значение null. Поэтому используйте регулярный цикл, который идет до 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
}
}
Но это немного чрезмерно, потому что вы повторяетесь дальше, чем вам нужно.
Поскольку Radiodef сказал, что ваш массив инициализирован как массив длиной 10, но позже вы только инициализировали два его элемента, поэтому, когда вы пропустите его через 2 цикла, вы пытаетесь запустить функцию нулевого объекта
если вы просто добавите строку кода в свой текущий код, вы также сможете использовать для каждого цикла, и он будет работать, просто проверьте, не является ли элемент не равным нулю, и таким образом вам не нужно знать, сколько элементов вы инициализировали, но когда вы храните счетчик в классе 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;
}