NullPointerException в Java в списке массивов

1

Я выполняю упражнение на 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() ;.

Это потому, что список не заполнен и поэтому он получает нулевые значения, поскольку он выполняет итерацию по списку? Если да, то как я могу остановить это? Я очень новичок в этом, поэтому, пожалуйста, успокойтесь и просто объясните. Я читал об этом по теме, но по-прежнему теряю то, что я делаю неправильно.

Теги:
nullpointerexception

2 ответа

3
Лучший ответ

Вы не можете использовать цикл 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
    }
}

Но это немного чрезмерно, потому что вы повторяетесь дальше, чем вам нужно.

  • 0
    Благодарю за ваш ответ. Я на самом деле рад, что это то, что я думал, проблема в том, что я просто не знал, как это исправить. Еще раз спасибо!
2

Поскольку 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;
     }   
  • 0
    Спасибо за ваш ответ. Приятно иметь информативных людей!
  • 0
    @Danrex, пожалуйста

Ещё вопросы

Сообщество Overcoder
Наверх
Меню