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

オブジェクトの作成に失敗しました 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

records[numRows] に何も割り当てていないためです。レコードを WarehouseItem オブジェクトの配列として定義しただけです。使用する前に、配列のそのインデックスに新しい WarehouseItem を割り当てる必要があります。

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

Java でオブジェクトの配列を作成すると、すべて null で初期化されます。そのため、nullpointerexception が発生します。

したがって、配列の位置ごとにオブジェクトを作成する必要があります。実際、メソッドを呼び出す代わりに、そのメソッドをコンストラクターにすることができます。その方が簡単です。

また、別の間違いにも気付きました。メソッドは、実際にはインスタンス変数を設定する必要があるのに、メソッドの存続期間中のみ存在するローカル変数を設定します。

次に、3 番目の間違いに気付きました。例外をキャッチしただけで、それが列の欠落を示していると想定しました。実際、列内の無効な型のデータを示している可能性があります (たとえば、整数ではなく文字列)。

于 2013-10-27T14:38:01.040 に答える