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 ...
我怎样才能让它发挥作用?
感谢!!!
答案 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);
}
}