BufferedReader внутри TreeMap - PullRequest
       1

BufferedReader внутри TreeMap

0 голосов
/ 25 января 2012
private static TreeMap<Integer, BufferedReader> firstMap = new TreeMap<Integer, BufferedReader>();
.
.
.
.
//fileNames is a list of file names in a directory...

for(int i = 0; i < fileNames.length; i++){
    if(!fileNames[i].startsWith(".")){
    String fileName = dirName + "/" + fileNames[i];
    DataInputStream in = new DataInputStream(new FileInputStream(fileName));
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
        firstMap.put(i, br);
    }
}

При доступе позже, как это:

   for(int i = 0; i < fileNames.length; i++){
            BufferedReader tempBr = firstMap.get(i);
            String line = tempBr.readLine();
}

Это дает исключение NullPointerException ...

Как мне заставить это работать ???

Спасибо !!!

Ответы [ 2 ]

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

Во-первых, поймите проблему. Если бы каждый файл в вашем каталоге начинался с точки, ваша TreeMap была бы пустой. Но что произойдет, если firstMap.get (i) и firstMap не содержат ключ i?

Документация для Map (интерфейс, который реализует TreeMap) сообщает вам:

V get (ключ объекта): Возвращает значение, которому сопоставлен указанный ключ, или значение NULL, если эта карта не содержит сопоставления для ключа.

Таким образом, если ключ не найден в вашем TreeMap, tempBr будет нулевым. Затем, когда вы вызываете tempBr.readLine (), вы получаете исключение NullPointerException, потому что у null нет метода readLine () или любого другого метода.

BufferedReader tempBr = firstMap.get(i);
String line = tempBr.readLine();

Решение: Хотя вы можете сделать это с помощью Map, ArrayList или LinkedList кажутся более естественным выбором. Это похоже на домашнее задание, поэтому я не даю вам точный код для решения вашей проблемы. Вот пример, который иллюстрирует вашу проблему и ее решение.

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;


public class MyClass {
static final String[] fileNames = {"a", ".b", "c", ".d", "e", ".f"};

public static void main(String[] args) {
    incorrect();
    corrected();
    improved();
}

public static void incorrect() {
    Map<Integer, String> myMap = new TreeMap<Integer, String>();

    for (int i = 0; i < fileNames.length; i++) {
        if (!fileNames[i].startsWith(".")) {
            myMap.put(i, fileNames[i]);
        }
    }

    System.out.println(myMap);

    for (int i = 0; i < fileNames.length; i++) {
        System.out.println(myMap.get(i));
    }
}

public static void corrected() {
    Map<Integer, String> myMap = new TreeMap<Integer, String>();

    for (int i = 0; i < fileNames.length; i++) {
        if (!fileNames[i].startsWith(".")) {
            myMap.put(i, fileNames[i]);
        }
    }

    System.out.println(myMap);

    for (int i = 0; i < fileNames.length; i++) {
        if (myMap.containsKey(i)) {
            System.out.println(myMap.get(i)); 
        }
    }
}

public static void improved() {
    List<String> myList = new ArrayList<String>();

    for (String fileName : fileNames) {
        if (!fileName.startsWith(".")) {
            myList.add(fileName);
        }
    }

    System.out.println(myList);

    for (String fileName : myList) {
        System.out.println(fileName);
    }
}
1 голос
/ 25 января 2012

Это потому, что вы только добавляете несколько целых чисел и BufferedReaders в TreeMap в этом коде:

for(int i = 0; i < fileNames.length; i++){
    if(!fileNames[i].startsWith(".")){
        String fileName = dirName + "/" + fileNames[i];
        DataInputStream in = new DataInputStream(new FileInputStream(fileName));
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        firstMap.put(i, br);
    }
}

Конкретно только те, для которых условие true.

Затем вы получите доступ ко всем возможным i значениям, а некоторые из них могут отсутствовать в TreeMap. В этом случае метод get вернет null.

Вам также необходимо проверить условие во втором цикле:

for(int i = 0; i < fileNames.length; i++) {
   if(!fileNames[i].startsWith(".")){
        BufferedReader tempBr = firstMap.get(i);
        String line = tempBr.readLine();
   }
}
...