1

嘿,我有一大段代码应该将 csv 文件的行加载到对象数组中:

public static WarehouseItem[] loadRecords(WarehouseItem[] records) {
  FileInputStream fileStrm = null;
  InputStreamReader rdr;
  BufferedReader bufRdr;
  int numRows = 0;
  String warehouseItem;
  String filename;

  filename = ConsoleInput.readLine("Please enter the filename (DataMillion.csv OR DataThousand.csv)");

  try {
    fileStrm = new FileInputStream(filename);
    rdr = new InputStreamReader(fileStrm);
    bufRdr = new BufferedReader(rdr);

    warehouseItem = bufRdr.readLine();
    records[numRows] = new WarehouseItem(warehouseItem);  //NULL POINTER EXCEPTION HERE
    System.out.println(records[0].toString(records[0].columnVals));
    while (warehouseItem != null) {
      numRows++;
      records[numRows] = new WarehouseItem(warehouseItem);
      warehouseItem = bufRdr.readLine();
    }
  fileStrm.close();
  }

  catch (IOException e) {
    if (fileStrm != null) {
      try { 
    fileStrm.close(); 
      } catch (IOException ex2) {}
    }
    System.out.println("Error in file processing: " + e.getMessage());
    }
    main(null);
    return records;
}

但是当我运行它时,我得到一个 NullPointerException 就行了

records[numRows] = new WarehouseItem(warehouseItem);

有什么我错过的吗?

这是 WarehouseItem 构造函数 + toString:

public class WarehouseItem {
  String[] columnVals;
  int numColumns = 5;

public WarehouseItem(String warehouseItem) {
  String key, brand, model, price, weightInKG;
  int intWeightInKG;
  double doublePrice; 
  StringTokenizer strTok;

  strTok = new StringTokenizer(warehouseItem, ",");
    key = strTok.nextToken();
    brand = strTok.nextToken();
    model = strTok.nextToken();
    intWeightInKG = Integer.parseInt(strTok.nextToken());
    doublePrice = Double.valueOf(strTok.nextToken());

    weightInKG = String.valueOf(intWeightInKG);
    price = String.valueOf(doublePrice);
  String[] columnVals = {key, brand, model, weightInKG, price};

  if(columnVals.length != 5)
    throw new IllegalStateException("Invalid CSV: not enough columns");
}

public String toString(String[] columnVals) {
  return ("Key:     " + columnVals[0] + "\n" + 
      "Brand:   " + columnVals[1] + "\n" + 
      "Model:   " + columnVals[2] + "\n" + 
      "Weight:  " + columnVals[3] + "\n" + " kg" + 
      "Price:   " + "$" + columnVals[4] + "\n");
}
}

我的问题是值没有正确存储到数组记录中,我不知道为什么

4

4 回答 4

2

您没有初始化数组,这是NullPointerException您的代码中的一个原因,但如果您不能使用数组,请不要使用它。

行数可能超过数组的容量,请List改用

List<WarehouseItem> records = new ArrayList<>();

String line = bufRdr.readLine();
while (line != null) {
  WarehauseItem warehauseItem = new WarehauseItem();
  records.add(warehauseItem);
  warehauseItem.processLine(line);
  line = bufRdr.readLine();
}
numRows = records.size();
于 2013-10-27T14:51:50.010 回答
1

当您在 Java 中创建对象数组时,它会使用所有空值进行初始化。这就是为什么你会得到一个空指针异常。

所以你需要为每个数组位置创建一个对象。实际上,您可以将该方法设置为构造函数,而不是调用方法;那会更简单。

我还注意到另一个错误:方法设置了局部变量,它只存在于方法的生命周期中,而实际上它应该设置实例变量。

然后我注意到了第三个错误:您刚刚捕获了异常,并假设这表明缺少列;事实上,它可以指示列内的无效类型数据(例如字符串而不是整数)。

于 2013-10-27T14:38:01.040 回答
1

您错过了对象创建 records[numRows]=new WarehouseItem();

你的代码需要是这样的。

while (warehouseItem != null) {
      records[numRows]=new WarehouseItem();  //here you forgot the object creation.
      warehouseItem = bufRdr.readLine();
      records[numRows].processLine(warehouseItem);
      numRows++; 
 }
于 2013-10-27T14:38:50.880 回答
1

因为您没有为记录[numRows] 分配任何内容。您只将记录定义为 WarehouseItem 对象的数组。您应该在使用之前将新的 WarehouseItem 分配给该数组的索引。

records[numRows] = new WarehouseItem();
warehouseItem = bufRdr.readLine();
records[numRows].processLine(wareHouseitem);
于 2013-10-27T14:38:51.607 回答