Java NullPointerException

Java NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我在第5行的类文章中得到了一个java.lang.NullPointerException 在一个类中,我创建了对象Article Article=new Article(), 然后我调用article.addPrice(数量、价格)是一个值为“1”的整数,price是一个值为“1.32”的浮点数 1: public class Article { 2: private List prices; 3: public void addPrice(Integer quantity, Float

我在
第5行的类文章中得到了一个
java.lang.NullPointerException

在一个类中,我创建了对象
Article Article=new Article()
, 然后我调用
article.addPrice(数量、价格)quantity
的code>是一个值为“
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: }

您的代码从不分配
价格
,因此该字段仍包含其初始值,即
null


用通俗易懂的英语,您的程序将读到:创建一个新的price对象,并将其添加到我分配给
prices
的列表中。您没有分配列表,因此计算机无法知道要添加到哪个列表。

您没有初始化私有列表变量。在
addPrice
中的第一行插入:

if (prices == null) {
    prices = new ArrayList<Price>();
}
if(价格==null){
价格=新的ArrayList();
}

这将确保在访问价格列表之前对其进行初始化。

未初始化“价格”列表,这将导致空引用。

您需要初始化价格列表

prices = new ArrayList<Price>();
prices=newarraylist();
公共类文章
{
私有列表价格=新的ArrayList();
公共无效附加价格(整数数量、浮动数量价格)
{
价格=新价格(数量、数量价格);
价格。添加(价格);
}
}

除非你把问题大大简化了,否则我想不出任何理由说明上述方法不起作用。

在你的代码中,你刚刚声明了列表价格,但没有初始化它

使用以下更正代码

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: }
1:公共类文章{
2:私有列表价格=新的ArrayList();
3:公共无效附加价格(整数数量、浮动数量价格){
4:价格=新价格(数量、数量价格);
5:本.价格.加(价格);
6:  }
7: }

因此,在您执行新建ArrayList()之前,您的价格中有null,并且您正试图在第5行的null上调用.add(price),因此出现了NullPointerException。

是否有理由使用ArrayList而不是List?或者我正试图向列表中添加一个对象,这是我无法实例化prices=new List()的原因吗?列表是一个接口,ArrayList是列表的一种类型。确切地说,在Java中,列表是一个接口,而不像在C#
中无法实例化类型列表
是的,列表是通用接口。您需要实例化一个适合您的代码的列表<如果您不确定需要什么,那么code>ArrayList
是一个很好的开始。很好,您建议使用
if
而不是构造函数有什么原因吗?只是延迟加载。如果article类总是要求初始化此数组列表,那么您应该将其移动到构造函数中。答案很好,您直接实例化列表而不是在构造函数中实例化列表有什么原因吗?以这种方式实例化列表与在构造函数中实例化列表完全相同。这意味着列表将在合成构造函数中初始化。您将在调试器中看到这正是Sam所说的。你在最初的问题中没有提到构造函数,我也不想做任何假设。以这种方式初始化的成员也将被实例化,无论调用哪个构造函数(如果有多个构造函数)——对于集合,我一直认为这很重要。如何修复它?如果您不打算提供答案,这应该是一个注释。不清楚OP是否只是想知道引发异常的原因,还是也想知道如何修复它。如果是前者,这是一个完整的答案,如果是后者,这是一个部分的答案-但这是一个答案在任何情况下。
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: }