Java NullPointerException

#java #nullpointerexception

#java #исключение nullpointerexception

Вопрос:

Я получаю java.lang.NullPointerException в моем классе статью в line 5 .

В одном классе я создаю объект Article article = new Article() , затем вызываю его, article.addPrice(quantity, price); при quantity котором он является целым числом со значением ‘ 1 ‘ и price является значением с плавающей точкой со значением ‘ 1.32 ‘.

 1: public class Article {
2:  private List prices;
3:  public void addPrice(Integer quantity, Float qtyPrice){
4:      Price price = new Price(quantity, qtyPrice);
5:      this.prices.add(price);
6:  }
7: }
  

Ответ №1:

вам необходимо инициализировать прайс-лист.

 prices = new ArrayList<Price>();
  

Комментарии:

1. Есть ли причина использовать ArrayList вместо списка? Или причина, по которой я не могу создать экземпляр prices = new List<Цена>(), заключается в том, что я пытаюсь добавить объект в список?

2. Список — это интерфейс, ArrayList — это тип списка.

3. точно, в Java List — это интерфейс, в отличие от C#

Ответ №2:

Ваш код никогда не присваивает значение prices , поэтому поле по-прежнему содержит его начальное значение, которое равно null .

На простом английском языке ваша программа будет читать: Создайте новый объект price и добавьте его в список, который я назначил prices . Вы не назначили список, и поэтому компьютер не может знать, в какой список добавлять …

Ответ №3:

Список ‘prices’ не инициализирован, что приводит к нулевой ссылке.

Комментарии:

1. Как это можно исправить? Это должен быть комментарий, если вы не собираетесь предоставлять ответ.

2. Неясно, хотел ли OP просто узнать, почему было сгенерировано исключение, или также хотел знать, как это исправить. В первом случае это полный ответ, во втором — частичный, но в любом случае это ответ.

Ответ №4:

 public class Article
{
 private List<Price> prices = new ArrayList<Price>();

 public void addPrice( Integer quantity, Float qtyPrice )
 {
  Price price = new Price( quantity, qtyPrice );
  prices.add( price );
 }
}
  

Если вы не сильно упростили проблему, я не могу придумать ни одной причины, по которой вышеупомянутое не сработало бы.

Комментарии:

1. отличный ответ, есть ли причина, по которой вы создаете экземпляр списка напрямую, а не в конструкторе?

2. Создание экземпляра списка таким образом точно такое же, как в конструкторе. Это означает, что список будет инициализирован в синтезированном конструкторе. Вы увидите это в отладчике как <clinit>

3. Именно то, что сказал Сэм. Вы не упомянули конструктор в своем первоначальном вопросе, и я не хотел делать никаких предположений. Элементы, инициализированные таким образом, также будут созданы независимо от того, какой конструктор вызывается (если их несколько) — с коллекциями я всегда считал это важным.

Ответ №5:

Вы не инициализировали переменную private list. Вставьте это в качестве первых строк в addPrice :

 if (prices == null) {
    prices = new ArrayList<Price>();
}
  

Это гарантирует, что прайс-лист инициализирован перед получением доступа.

Комментарии:

1. cannot instantiate the type List<Price>

2. Да, List — это универсальный интерфейс. Вам необходимо создать экземпляр списка, соответствующий вашему коду. ArrayList это хорошее начало, если вы не уверены, что вам нужно.

3. отлично, есть ли причина, по которой вы предложили if вместо конструктора?

4. Просто отложенная загрузка. Если класс article всегда будет требовать инициализации этого списка массивов, вам, безусловно, следует переместить его в конструктор.

Ответ №6:

В вашем коде вы только что объявили список цен, но не инициализировали его.

Используйте следующий исправленный код :

 1:  public class Article {
2:  private List<Price> prices = new ArrayList<Price>();
3:  public void addPrice(Integer quantity, Float qtyPrice){
4:      Price price = new Price(quantity, qtyPrice);
5:      this.prices.add(price);
6:  }
7: }
  

итак, до того момента, как вы создадите new ArrayList(), у вас есть null в prices, и вы пытаетесь вызвать .add(price) для null в строке 5, отсюда и исключение NullPointerException.