为什么我在Collections.shuffle(List)之后得到空行?

时间:2012-01-10 20:18:56

标签: java collections nullpointerexception shuffle

我正在编写一些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则为空。

任何人都可以向我解释为什么会这样,以及如何避免它?

2 个答案:

答案 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块中关闭。