我正在编写一些Java代码来将数据文件的每一行读入一个数组列表,对该列表进行洗牌,然后对混洗数据执行一些进一步的操作。问题是,在洗牌之后,我得到了数组列表中某些元素的空元素。
//this file contains the data
String input = ...;
//this file contains the number of rows in the data file
String input2 = ...;
FileInputStream fstream2 = new FileInputStream(input2);
DataInputStream in2 = new DataInputStream(fstream2);
BufferedReader brIndex = new BufferedReader(new InputStreamReader(in2));
for(int i = 1; i <= N; i++) {
FileInputStream fstream = new FileInputStream(input+(i+1)+".txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader brData = new BufferedReader(new InputStreamReader(in));
num = Integer.parseInt(brIndex.readLine());
ArrayList<String> temp = new ArrayList<String>();
for(int j = 0; j < num; j++) {
temp.add(brData.readLine());
}
brData.close();
Collections.shuffle(temp);
//read in shuffled data
for(int j = 0; j < num; j++) {
rowData = temp.get(j); ...
}
在执行代码时,我在使用NullPointerException
后获得rowData
。原始文件有17,169行(它们都不是null)。 temp.size()
也是17,169但是当我将temp打印到控制台时,某些temp.get(j)
的{{1}}为空,而其他j
则为空。
任何人都可以向我解释为什么会这样,以及如何避免它?
答案 0 :(得分:3)
问题可能是文件中没有足够的行num
。
尝试:
List<String> temp = new ArrayList<String>();
String line;
while((line = br.readLine()) != null) {
temp.add(brData.readLine());
}
在实际混洗列表之前,您还可以检查列表中的空元素,因为shuffle不会向列表中插入任何新元素。
答案 1 :(得分:1)
您永远不会检查readLine()
是否返回null。检查一下,你会发现你可能已经阅读了文件的末尾。
此外,读者,作家和流应始终在finally块中关闭。