You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从文件读取字符串数组转对象数组时遇空指针异常求助

解决空指针异常的问题

嘿,我一眼就揪出你代码里的问题啦!你遇到的空指针异常,根源在于**GMIstock数组既没被初始化,数组里的每个Product元素也没创建实例**——你只是声明了private Product[] GMIstock;,但从来没给它分配内存,也没给数组的每个位置创建Product对象,所以当你调用GMIstock[count].setName()时,GMIstock[count]本身是null,自然就抛出空指针了。

问题拆解

  1. 数组未初始化:Product[] GMIstock;只是告诉编译器“我要一个Product类型的数组”,但并没有实际创建这个数组(比如new Product[size]),此时GMIstock本身就是null。
  2. 元素未实例化:就算你初始化了数组,数组里的每个位置默认都是null,必须先创建Product实例(new Product()),才能调用它的setName等方法。

两种修复方案

考虑到你不知道CSV文件里有多少产品,我推荐两种常用的解决方式:

方案1:用动态集合ArrayList(更灵活)

ArrayList可以自动扩容,适合不确定元素数量的场景,之后如果需要数组,再转成数组即可:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Global_Inventory_Management {
    String fileName = "src/data.csv";
    File file = new File(fileName);
    // 用ArrayList动态存储产品
    private ArrayList<Product> GMIstockList = new ArrayList<>();
    // 若需要数组,后续可转换
    private Product[] GMIstock;

    public void readStock() {
        try {
            Scanner reader = new Scanner(file);
            reader.next(); // 跳过表头行

            while (reader.hasNext()) {
                String data = reader.next();
                String[] values = data.split(",");
                System.out.println(values[0]);
                System.out.println(values[1]);
                System.out.println(values[2]);

                // 关键:先创建Product实例!
                Product product = new Product();
                product.setName(values[0]);
                product.setQuantity(Integer.parseInt(values[1]));
                product.setPrice(Double.parseDouble(values[2]));

                // 添加到集合中
                GMIstockList.add(product);
                // 验证赋值结果
                System.out.println(product.getName());
            }

            // 可选:将集合转为数组
            GMIstock = GMIstockList.toArray(new Product[0]);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

方案2:先统计行数再初始化数组

如果你坚持要用数组,可以先遍历一次文件统计数据行数,再初始化对应大小的数组:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Global_Inventory_Management {
    String fileName = "src/data.csv";
    File file = new File(fileName);
    private Product[] GMIstock;

    public void readStock() {
        try {
            // 第一步:统计数据行数(跳过表头)
            Scanner countReader = new Scanner(file);
            countReader.next();
            int rowCount = 0;
            while (countReader.hasNext()) {
                countReader.next();
                rowCount++;
            }
            countReader.close();

            // 初始化对应大小的数组
            GMIstock = new Product[rowCount];

            // 第二步:读取数据并赋值
            Scanner reader = new Scanner(file);
            reader.next(); // 跳过表头
            int count = 0;

            while (reader.hasNext()) {
                String data = reader.next();
                String[] values = data.split(",");
                System.out.println(values[0]);
                System.out.println(values[1]);
                System.out.println(values[2]);

                // 关键:创建Product实例
                GMIstock[count] = new Product();
                GMIstock[count].setName(values[0]);
                GMIstock[count].setQuantity(Integer.parseInt(values[1]));
                GMIstock[count].setPrice(Double.parseDouble(values[2]));

                System.out.println(GMIstock[count].getName());
                count++;
            }
            reader.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

核心要点回顾

  • 引用类型数组声明后,必须用new关键字初始化(分配内存空间)。
  • 数组中的每个引用类型元素,都需要单独实例化(new Product()),否则默认是null。
  • 处理不确定数量的数据时,优先选择ArrayList这类动态集合,避免数组大小不匹配的问题。

内容的提问来源于stack exchange,提问作者Jonathan Blew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:03:26