读取文件时线程“main”java.lang.NullPointerException中的异常

时间:2012-06-17 19:24:57

标签: java file-io

Exception in thread "main" java.lang.NullPointerException
    at Library.loadBooks(Library.java:179)
    at UseLibrary.main(UseLibrary.java:105)

这个错误让我发疯了!

public void loadBooks(String s) throws IOException{
    String str[] = new String[6];
    String inFName = ".//" + s ;
    BufferedReader input = new BufferedReader(new FileReader(inFName));
    int x;
    double y;
    String line = "";
    while(line != null){

        for(int i=0; i<6; i++){
            str[i] = new String();
            line = input.readLine();
            str = line.split("[-]");
            x = Integer.parseInt(str[1]);
            y = Double.parseDouble(str[2]);
            Book a = new Book(str[0], x, y, str[3], str[4], str[5]);
            add(a);
        } 

    }
}

此代码有什么问题?

我初始化数组,但它没有运行!

更新1

save.txt我有

1 Don Knuth-290-23.45-The Art of Programming with Java-HG456-Engineering-5 
2 A. Camp-400-13.45-An Open Life-HSA234-Philosophy-1 
3 James Jones-140-12.11-Oh, Java Yeah!-SDF213-Science Fiction-2 
4 J. Campbell-250-32.45-An Open Life-JH45-Science-3 
5 Mary Kennedy-230-56.32-Intro to CS Using Java as the Language-USN123-Science-4

4 个答案:

答案 0 :(得分:0)

很难理解抛出Exception的行,但我猜这些:

x = Integer.parseInt(str[1]);
y = Double.parseDouble(str[2]);

在解析之前检查str[1]str[2]是否不是null

答案 1 :(得分:0)

我认为问题是

您的saved.txt中有5行或更少的行,并且由于第6次迭代的for循环,因为没有行的数据,您将获得NullPointerException

请按照以下步骤告诉我你得到的内容......

而不是

while(line != null){

    for(int i=0; i<6; i++){
        str[i] = new String();
        line = input.readLine();
        str = line.split("[-]");
        x = Integer.parseInt(str[1]);
        y = Double.parseDouble(str[2]);
        Book a = new Book(str[0], x, y, str[3], str[4], str[5]);
        add(a);
    } 

}

使用

while ((line = input.readLine()) != null) {
        str = line.split("[-]");
        Book a = new Book(str[0], Integer.parseInt(str[1]), Double.parseDouble(str[2]), str[3], str[4], str[5]);
        add(a);
}

如果您仍然遇到任何问题,请告诉我。

更新1

根据您的更新,

save.txt我有

1 Don Knuth-290-23.45-The Art of Programming with Java-HG456-Engineering-5 
2 A. Camp-400-13.45-An Open Life-HSA234-Philosophy-1 
3 James Jones-140-12.11-Oh, Java Yeah!-SDF213-Science Fiction-2 
4 J. Campbell-250-32.45-An Open Life-JH45-Science-3 
5 Mary Kennedy-230-56.32-Intro to CS Using Java as the Language-USN123-Science-4

如您所见,您的文件中有5行,对于第6次迭代,您将获得NullPointerException

同时阅读,how to print content of files in Java

答案 2 :(得分:0)

你有一个while循环检查line是否为空,不是这样,while循环运行,但是你有一个调用line = input.readLine();的for循环,6次,并且永远不会检查它是否为null。在某些时候,line可能为null,因为您已到达文件的末尾。您需要在for循环中检查line是否为null,或者以不同的方式计算循环。

答案 3 :(得分:0)

您的问题在于以下两行代码:

line = input.readLine();
str = line.split("[-]");

首先,您从文件中读取一行。您假设该文件至少有6行,这显然是错误的假设。如果已到达流的末尾,则BufferedReader#readLine会返回null 。您不检查line是否为空,并且在空对象上调用导致NPE的split