【问题标题】:ArrayList of Objects from a different class - null pointer error来自不同类的对象的 ArrayList - 空指针错误
【发布时间】:2015-05-23 02:21:14
【问题描述】:
public void populatePrizeArraylist()
{
    ArrayList <Prize> prizeArrayList = new ArrayList <Prize>();
    // The name of the file which we will read from   
    File filename = new File("prizes.txt");

    try 
    {   
        // Prepare to read from the file, using a Scanner object
        FileReader inputFile = new FileReader(filename);

        Scanner parser = new Scanner(inputFile);
        // Read each line until end of file is reached
        while (parser.hasNextLine())
        {
            // Read an entire line, which contains all the details for 1 prize
            String readFile = parser.nextLine();
            String delimiter = ","; 
            String[] fileList = readFile.trim().split(delimiter);

            Prize newPrize = new Prize();

            newPrize.setPrizeName(fileList[0]);
            newPrize.setPrizeWorth(Integer.parseInt(fileList[1]));
            newPrize.setPrizeCost(Integer.parseInt(fileList[2]));

            this.prizeArrayList.add(newPrize);

        }
    }
}

我在这里做错了什么?我创建了一个新的 ArrayList,然后创建了一个新对象,并为该对象的 name 变量设置了一些值,但是当我尝试将该对象添加到我的 arraylist 时,我得到一个空点异常错误

【问题讨论】:

  • 你确定你得到一个运行时异常吗?您的代码将无法编译,因为您试图在 ArrayList 上调用不存在的 setGoodName() 方法而不是您的对象 newItem
  • 嗨 @kaykay 我已经放了更多代码,你能找出问题所在
  • 此代码与您之前发布的 sn-p 完全不同。请考虑使您的问题更清楚。想象一下,如果有人要求您调试一些代码,您希望从他们那里得到什么信息

标签: java arraylist


【解决方案1】:

这个变量声明在方法范围内

ArrayList <Prize> prizeArrayList = new ArrayList <Prize>();

并且您正在尝试使用添加元素

this.prizeArrayList.add(newPrize);

所以我确定定义了一个尚未初始化的类级别变量“prizeArrayList”,您正在尝试添加它并获取 NPE。

你必须使用

prizeArrayList.add(newPrize);

【讨论】:

  • 如何初始化它?
  • 查看您的方法,您不想添加到类级别变量。只需从将 newPrize 添加到prizeArrayList 的行中删除“this”即可。
  • 好的,但现在我无法从任何其他方法访问它,因为 PrizeArrayList 不是类级变量,它只是在方法范围内创建它然后消失?
  • 然后让我们初始化你的类级变量。使用new ArrayList &lt;Prize&gt;(); 将一个空列表分配给您的类级别变量。您不需要方法范围prizeArrayList,所以只需从方法中删除该行(第一个)。
  • 使用this.prizeArrayList.add(newPrize);。您的原始代码将起作用。
【解决方案2】:

如果我没看错你的代码。 您正在 void 函数中填充数组列表。 数组列表是在该函数中本地创建的。 如果您没有在某处返回该数组列表,则该数组列表在您的函数结束后被删除。

附加建议,使用构造函数通过默认构造函数创建一个类然后通过方法将其属性设置为某个值是不好的习惯。

【讨论】:

  • 感谢@Spidey 在这里学到了很多东西。那么你会推荐什么呢?
  • @Tarinkot 使用自定义构造函数,它们将允许您在参数中为属性添加值。如果你不熟悉它们,我推荐一个很好的 java 教程页面。
  • @Tarinkot 关于主要问题,我建议您在需要使用的地方返回阵列列表。
【解决方案3】:
goodsArrayList.setGoodName("Pants");
goodsArrayList.add(newItem);

是错误的,因为您需要将setGoodName() 调用到newItem 试试这个:

newItem.setGoodName("Pants");
goodsArrayList.add(newItem);

【讨论】:

  • 嗨,杰克,它编译正常,但我得到一个空指针异常错误
猜你喜欢
  • 2017-04-22
  • 2019-05-04
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 2011-12-18
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多