1

我正在尝试逐行读取文件,但是每次运行程序时,我都会在该行收到 NullPointerException,spaceIndex = line.indexOf(" ");这显然意味着该行为空。然而。我知道我正在使用的文件正好有 7 行(即使我打印 的值numLines,我得到的值也是 7。但是当我尝试将一行读入我的字符串时,我仍然得到一个空指针异常。

// File file = some File I take in after clicking a JButton

Charset charset = Charset.forName("US-ASCII");
try (BufferedReader reader = Files.newBufferedReader(file.toPath(), charset)) {

    String line = "";

    int spaceIndex;
    int numLines = 0;
    while(reader.readLine()!=null) numLines++;

    for(int i = 0; i<numLines; i++) {
        line = reader.readLine();
        spaceIndex = line.indexOf(" ");
        System.out.println(spaceIndex);
}

PS:(我实际上并没有使用此代码来打印空间的索引,我替换了循环中的代码,因为它有很多,它会使阅读时间更长)

如果我要以错误的方式阅读这些行,那么如果有人可以提出另一种方式,那就太好了,因为到目前为止,我尝试过的每一种方式都给了我同样的例外。谢谢。

4

2 回答 2

5

当您开始for循环时,阅读器已经在文件的末尾(来自while循环)。

所以,readLine()总会回来null的。

当您第一次读取文件时,您应该摆脱for循环并在循环中完成所有工作。while

于 2013-09-01T15:49:53.373 回答
1

你有两个选择。

首先,您可以通过这种方式从文件中读取行数:

LineNumberReader  lnr = new LineNumberReader(new FileReader(new File("File1")));
lnr.skip(Long.MAX_VALUE);
System.out.println(lnr.getLineNumber());

然后立即读取文件:

while((line = reader.readLine())!=null)
{
    spaceIndex = line.indexOf(" ");
    System.out.println(spaceIndex);
}

第一个选项是一种替代方法(在我看来,更酷)。

第二种选择(可能更明智)是在 while 循环中一次完成所有操作:

while((line = reader.readLine())!=null) 
{
    numLines++;
    spaceIndex = line.indexOf(" ");
    System.out.println(spaceIndex);
}
于 2013-09-01T15:55:37.897 回答