将单个csv对象存储到数组中

时间:2013-10-27 14:34:06

标签: java arrays object csv io

嘿,我有一大堆代码可以将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 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

在Java中创建对象数组时,会使用所有空值对其进行初始化。这就是为什么你得到一个nullpointerexception。

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

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

然后我注意到第三个错误:你刚刚发现异常,并认为这表明缺少列;实际上,它可以指示列内的无效类型数据(例如字符串而不是整数)。

答案 2 :(得分: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++; 
 }

答案 3 :(得分:1)

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

records[numRows] = new WarehouseItem();
warehouseItem = bufRdr.readLine();
records[numRows].processLine(wareHouseitem);