TreeMap中的BufferedReader

时间:2012-01-25 18:29:41

标签: java bufferedreader treemap

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 个答案:

答案 0 :(得分:1)

这是因为您只在此代码中的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();
   }
}

答案 1 :(得分:1)

首先,了解问题。如果目录中的每个文件都以句点开头,则TreeMap将为空。但是,如果firstMap.get(i)和firstMap不包含密钥i会发生什么?

documentation for Map(TreeMap实现的接口)告诉你:

  

V get(对象键):   返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

因此,如果在TreeMap中找不到该键,则tempBr将为null。然后,当你调用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);
    }
}