从文件读取字符串数组转对象数组时遇空指针异常求助
解决空指针异常的问题
嘿,我一眼就揪出你代码里的问题啦!你遇到的空指针异常,根源在于**GMIstock数组既没被初始化,数组里的每个Product元素也没创建实例**——你只是声明了private Product[] GMIstock;,但从来没给它分配内存,也没给数组的每个位置创建Product对象,所以当你调用GMIstock[count].setName()时,GMIstock[count]本身是null,自然就抛出空指针了。
问题拆解
- 数组未初始化:
Product[] GMIstock;只是告诉编译器“我要一个Product类型的数组”,但并没有实际创建这个数组(比如new Product[size]),此时GMIstock本身就是null。 - 元素未实例化:就算你初始化了数组,数组里的每个位置默认都是
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
相关产品推荐
相关产品推荐

