Почему я получаю нулевые строки после Collections.shuffle (List)? - PullRequest
2 голосов
/ 11 января 2012

Я пишу некоторый код 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 строк (ни одна из них не пуста). temp.size() также равно 17,169, но когда я выводил temp на консоль, temp.get(j) был нулевым для некоторых j, а не для других.

Может кто-нибудь объяснить мне, почему это так и как этого избежать?

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Возможно, проблема в том, что в файле недостаточно строк как num.

Попробуйте:

List<String> temp = new ArrayList<String>();
String line;
while((line = br.readLine()) != null) {
    temp.add(brData.readLine());
}

Вы также можете проверить наличие нулевых элементов в списке перед тем, как фактически перетасовать список, так как функция shuffle не вставляет новый элемент в список.

1 голос
/ 11 января 2012

Вы никогда не проверяете, возвращает ли readLine() ноль или нет.Проверьте это, и вы обнаружите, что, вероятно, читаете за концом файла.

Кроме того, читатели, пишущие и потоки всегда должны быть закрыты в блоке finally.

...