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");
}
}
我的问题是这些值没有正确存储到数组记录中,我不知道为什么
答案 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);